我有一个我创建的代码生成器,并且我希望能够在服务器上运行它。生成器使用纯原生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列,缺少分号。 –