2016-08-02 50 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' –