10

我正在通过 websockets 在 HTML5 客户端和在 node.js 上运行的服务器之间执行消息传递。自然地,我选择了 JSON 作为消息格式,因此创建了通用的 javascript 代码,定义了各种消息内容类型和转换操作。javascript 代码在两个项目之间共享。

我将我的 Web 客户端创建为一个 git 项目,将我的服务器创建为另一个 git 项目。部分原因是我正在使用 phonegap 为各种基于触摸的环境构建基于 webkit 的客户端。这也是各种逻辑的很好分离。

为了共享通用代码,我为通用逻辑创建了一个单独的项目,并使用 git 的子项目将代码“导入”到其他两个项目中。

现在这适用于基于 html5 的项目,因为我可以执行以下操作来包含代码:

<script src="common/js/comms.js" type="text/javascript"></script>

但是对于节点,我在尝试获取代码时遇到了问题。为了获得代码,我最终做了以下事情:

var fs = require('fs');
eval(fs.readFileSync('./common/js/comms.js').toString());

虽然我采用的方法有效,但我注意到当我有依赖项时它开始变得非常混乱(例如,如果我想要 a.js,我需要 x.js、y.js 和 x.js),而且我必须为希望使用这些实体中的任何一个的每个 node.js js 文件执行此操作。

我也不习惯使用这种eval方法。我没有安全问题,尽管我想使用严格模式,我的理解是 eval 和严格模式像油和水一样结合在一起。

所以我的问题是,在 html 项目和 node.js 项目之间包含共享 js 文件的最佳方法是什么?我更喜欢遵循严格的东西。

我应该注意到,虽然围绕这个主题有几个问题,但我找不到任何可以解决我提出的具体问题的问题。我还应该补充一点,我不希望从“服务器”“提供”文件。HTML5 客户端是“独立的”。


澄清一下,我在“通用 js 文件”中的内容类似于以下内容:

var Comms = function (options) {
   ...
}

在 HTML5 中,我可以只引用 via new Comms(),这也是我希望在 node.js 中做的事情。

4

2 回答 2

5

你研究过 Node 模块是如何工作的吗?如果您正在使用此模式进行开发,那么require('./common/js/comms')在服务器上使用它相当简单,同时仍将其包含在您的客户端上。

本文应该为您指明正确的方向:https ://caolan.org/posts/writing_for_node_and_the_browser.html


以下是 Tyler 在下面的评论中链接到的代码。

示例(example.js):

if(typeof exports == "undefined"){
    exports = this;
}

Example = function() {
    this.init();
};

Example.prototype = {
    init: function() {
         console.log('hello world');
    }
};

exports.Example = new Example();

example.js(app.js)的node.js用法:

example = require('./example');

example.js(index.html)的html用法:

<html>
    <head>
        <title></title>
    </head>
    <body>
        <script src="./example.js"></script>
    </body>

OP 的更改是分配exports.ExampleExample而不是分配给新实例。因此 node.js 逻辑可以使用以下内容:

var Example = require('./example.js').Example;
var foo = new Example();

这样原问题就解决了。

于 2013-01-25T23:48:21.420 回答
1

看看nodeJS 模块

将在 comm.js 中:

module.exports = function(/* any dependency? */){
   // things
   // you can return some object
}

在你需要 comm.js 的文件中

require('./common/js/comm.js')();
// or you can assign it to a variable if it returned something

希望有帮助!

于 2013-01-25T23:48:59.783 回答