我有一個我創建的代碼生成器,並且我希望能夠在服務器上運行它。生成器使用純原生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端口
謝謝,我接受任何有用的建議。
到底是什麼問題?你想運行一個節點的網絡服務器,那裏沒有結束的教程。你看了?你嘗試過什麼嗎?你想在節點下運行上面的代碼。當你做什麼時會發生什麼?你得到什麼錯誤信息?你做了什麼來嘗試解決它們? – Quentin
我寫過幾個節點應用程序,就像使用expressjs和其他中間件所述的一樣......他們都使用Jade和EJS。我想使用原始JavaScript ES6。我正在構建自己的中間件,我需要知道如何服務它所產生的內容。這裏是我的回購https://github.com/nicholasmabrams/JSML的鏈接。這是生成代碼的原因。它在客戶端很好,但是我需要使它在節點上運行,所以我可以選擇使用它在服務器或客戶端上進行渲染。 –
您嘗試的代碼有多個錯誤 - 第4行,第1列,期望賦值或函數調用,而是看到一個表達式。 第5行,第70行,無效的typeof值「符號」 第49行,第28行,預期賦值或函數調用,而是看到一個表達式。 第98行,第3行,預期')',而是看到';'。 第98行,第4列,缺少分號。 –