2016-08-02 120 views
-3

我有一個我創建的代碼生成器,並且我希望能夠在服務器上運行它。生成器使用純原生ECMA6 javascript呈現HTML標記。我想在NodeJS上利用這個,但如果可能的話沒有整個重寫(我知道一些fs代碼將需要等)。我想使用這個腳本就像使用它的文件系統包裝器一樣,並且使用一個接口將輸出直接發送到瀏覽器進行渲染。如何使用原始Javascript與節點

我已經使用了Express和其他一些框架的Node,但是總是涉及到中間件。我希望做什麼?

如果是這樣怎麼樣?

在使用npm進一步研究之後,我能夠獲得它的一個簡單版本通過閱讀此線程讀取靜態HTML腳本輸出的簡單HTTP服務器:使用node.js作爲簡單的Web服務器通過這個線程在Node.js中編寫文件,將腳本的輸出寫入HTML文件。然而主要的圖書館不會運行。

這裏是我試過的代碼:

var fs = require('fs'); 



var _typeof = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? function (obj) { 
    return typeof obj; 
} : function (obj) { 
    return obj && typeof Symbol === 'function' && obj.constructor === Symbol ? 'symbol' : typeof obj; 
}; 
function _classCallCheck(instance, Constructor) { 
    if (!(instance instanceof Constructor)) { 
     throw new TypeError('Cannot call a class as a function'); 
    } 
} 
var JSML = function() { 
'use strict'; 

    function JSML(stdIn) { 
     _classCallCheck(this, JSML); 
     this.output = ''; 
     this.parse(stdIn); 
     return this.output; 
    } 
    JSML.prototype.generateAttributeKeyValueString = function generateAttributeKeyValueString(key, value) { 
     return key + '=\'' + value + '\''; 
    }; 
    JSML.prototype.camelCaseToDashes = function camelCaseToDashes(str) { 
     return str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase(); 
    }; 
    JSML.prototype.generateDom = function generateDom(vNode) { 
     var self = this, selfClosingTagNames = [ 
       'area', 
       'base', 
       'br', 
       'col', 
       'command', 
       'embed', 
       'hr', 
       'img', 
       'input', 
       'keygen', 
       'link', 
       'meta', 
       'param', 
       'source', 
       'track', 
       'wbr' 
      ], elmStart = '<' + vNode.elm, elmAttrs = '', elmEnd, elmContent; 
     selfClosingTagNames.forEach(function (selfClosingTagName) { 
      if (vNode.elm === selfClosingTagName) 
       elmEnd = ''; 
      else 
       elmEnd = '</' + vNode.elm + '>'; 
     }); 
     function parseInput(vNode, key) { 
      if (!vNode.hasOwnProperty(key)) 
       return; 
      var value = vNode[key], isActualInnerValueChildContents = key === 'inner' && typeof value === 'string', isChildrenContentArr = key === 'inner' && Array.isArray(value), isSingleChildContent = key === 'inner' && !isChildrenContentArr && (typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object', isAttributeKeyValuePair = key !== 'elm' && key !== 'inner'; 
      if (isActualInnerValueChildContents) 
       elmContent = value; 
      else if (isAttributeKeyValuePair) 
       elmAttrs += self.generateAttributeKeyValueString(self.camelCaseToDashes(key), value); 
      else if (isChildrenContentArr) { 
       elmContent = ''; 
       value.forEach(function (subValue) { 
        elmContent += JSML.run(subValue).output; 
       }); 
      } else if (isSingleChildContent) 
       elmContent = JSML.run(value).output; 
     } 
     for (var key in vNode){ 
     if (vNode.hasOwnProperty(key)) parseInput(vNode, key); 
     } 

     elmStart += ' ' + elmAttrs + '>'; 
     if (elmContent) 
      this.output = elmStart + elmContent + elmEnd; 
     else 
      this.output = elmStart + elmEnd; 
    }; 
    JSML.prototype.parse = function parse(input) { 
     var self = this; 
     self.generateDom(input); 
    }; 
    return JSML; 
}(); 
JSML.run = function (appCode, target) { 
    var defaultTarget = 'body', dom = new JSML(appCode); 
    document.getElementsByTagName(target || defaultTarget)[0].innerHTML = dom.output; 
    return dom; 
}; 

fs.writeFile("index2.html", JSML.run({ 
    elm: 'img', 
    src: 'http://placehold.it/50x50' 
}, function(err) { 
    if(err) { 
     return console.log(err); 
    } 

    console.log("The file was saved!"); 
}); 

我不斷收到 「意外的標記;」在像98

主要思想是generateView.js我需要我的服務器上運行JavaScript的,生成服務從我的腳本生成的內容所需的標記,只是讓說,80端口

謝謝,我接受任何有用的建議。

+0

到底是什麼問題?你想運行一個節點的網絡服務器,那裏沒有結束的教程。你看了?你嘗試過什麼嗎?你想在節點下運行上面的代碼。當你做什麼時會發生什麼?你得到什麼錯誤信息?你做了什麼來嘗試解決它們? – Quentin

+0

我寫過幾個節點應用程序,就像使用expressjs和其他中間件所述的一樣......他們都使用Jade和EJS。我想使用原始JavaScript ES6。我正在構建自己的中間件,我需要知道如何服務它所產生的內容。這裏是我的回購https://github.com/nicholasmabrams/JSML的鏈接。這是生成代碼的原因。它在客戶端很好,但是我需要使它在節點上運行,所以我可以選擇使用它在服務器或客戶端上進行渲染。 –

+0

您嘗試的代碼有多個錯誤 - 第4行,第1列,期望賦值或函數調用,而是看到一個表達式。 第5行,第70行,無效的typeof值「符號」 第49行,第28行,預期賦值或函數調用,而是看到一個表達式。 第98行,第3行,預期')',而是看到';'。 第98行,第4列,缺少分號。 –

回答

0

如果我理解了,只需將您的代碼放入js文件,例如script.js即可。並運行node script.js

也許YOUT必須包裝你的類模塊,這是一個好點的地方開始學習https://nodejs.org/api/modules.html


或者,如果你想要的服務器,嘗試Express js

const express = require('express'); 
const app = express(); 

const JSML = express('./JSML'); // <--- your module 
let jsml = newJSML(); 

app.get('/home', function(req, res){ 
    res.send(jsml.run()); 
}); 

app.listen(80); 
+0

那麼,最重要的部分是服務的內容。可以說172.0.0.10/home顯示我的發電機的輸出 –

+0

我想直接使用NodeJS作爲服務器 –

+0

,但你需要改變'run()'方法,因爲它引用了webbrowser' document.querySelectorAll' –