最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - including js files with html and node.js - Stack Overflow

programmeradmin5浏览0评论

I am performing messaging via websockets between a HTML5 client and server running on node.js. Naturally I chose JSON as the message format and as such created mon javascript code, defining the various message content types and transformation operations. The javascript code is shared between both projects.

I created my web client as one git project and my server as another git project. Partly because I am using phonegap to build a webkit based client for various touch based environments. It's also a nice separation of the various logic.

To share the mon code I created a separate project for the mon logic and used git's subprojects to 'import' the code into the other two projects.

Now this works fine for the html5 based project, as I can just do the following to include the code:

<script src="mon/js/ms.js" type="text/javascript"></script>

However with node I've had problems trying to get the code. to get the code, I've ended up doing the following:

var fs = require('fs');
eval(fs.readFileSync('./mon/js/ms.js').toString());

While the approach I have taken works, I've noticed that it's starting to get very messy when I have dependencies (as in, I need x.js, y.js and x.js if I want a.js), and I have to do it for every single node.js js file that wishes to use any of these entities.

I'm also not fortable using the eval approach. I don't have a security issue with it, though I would like to use strict mode and it's my understanding that eval and strict mode go together like oil and water.

So my question is, what is the best method to include shared js files between html projects and node.js projects? I would prefer something that follows strict.

I should note that while there are several questions that are kinda around this topic, I could not find any that address the specific issues I'm raising. I should also add that I do not wish to 'serve' the files from the 'server'. The HTML5 client is to be 'standalone'.


To clarify, what I have in the 'mon js files' is something like the following:

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

In HTML5 I can then just reference is via new Comms(), which is what I desire to do in node.js as well.

I am performing messaging via websockets between a HTML5 client and server running on node.js. Naturally I chose JSON as the message format and as such created mon javascript code, defining the various message content types and transformation operations. The javascript code is shared between both projects.

I created my web client as one git project and my server as another git project. Partly because I am using phonegap to build a webkit based client for various touch based environments. It's also a nice separation of the various logic.

To share the mon code I created a separate project for the mon logic and used git's subprojects to 'import' the code into the other two projects.

Now this works fine for the html5 based project, as I can just do the following to include the code:

<script src="mon/js/ms.js" type="text/javascript"></script>

However with node I've had problems trying to get the code. to get the code, I've ended up doing the following:

var fs = require('fs');
eval(fs.readFileSync('./mon/js/ms.js').toString());

While the approach I have taken works, I've noticed that it's starting to get very messy when I have dependencies (as in, I need x.js, y.js and x.js if I want a.js), and I have to do it for every single node.js js file that wishes to use any of these entities.

I'm also not fortable using the eval approach. I don't have a security issue with it, though I would like to use strict mode and it's my understanding that eval and strict mode go together like oil and water.

So my question is, what is the best method to include shared js files between html projects and node.js projects? I would prefer something that follows strict.

I should note that while there are several questions that are kinda around this topic, I could not find any that address the specific issues I'm raising. I should also add that I do not wish to 'serve' the files from the 'server'. The HTML5 client is to be 'standalone'.


To clarify, what I have in the 'mon js files' is something like the following:

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

In HTML5 I can then just reference is via new Comms(), which is what I desire to do in node.js as well.

Share Improve this question edited Jan 3, 2018 at 0:57 Metalskin asked Jan 25, 2013 at 23:40 MetalskinMetalskin 4,2687 gold badges40 silver badges63 bronze badges 4
  • possible dup of stackoverflow./questions/7310176/… – mpm Commented Jan 25, 2013 at 23:45
  • Yes I would say these questions are very similar and I think it definitely answers his question. – Ryan Smith Commented Jan 25, 2013 at 23:48
  • If not you could always use grunt to concat the files. – Ryan Smith Commented Jan 25, 2013 at 23:49
  • If I use exports in a js file used by html, will I not get an error because exports is not defined? @mpm it doesn't solve my problem as it changes the js file to work with node.js, which afaict will cause it to break with the html code. – Metalskin Commented Jan 25, 2013 at 23:55
Add a ment  | 

2 Answers 2

Reset to default 6

Have you researched how Node modules work? If you're developing using this pattern, it's fairly simple to use require('./mon/js/ms') on the server while still including it on your client as well.

This article should point you in the right direction: https://caolan/posts/writing_for_node_and_the_browser.html


The following is the code that Tyler linked to in his ments below.

The example (example.js):

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

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

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

exports.Example = new Example();

The node.js usage of example.js (app.js):

example = require('./example');

The html usage of example.js (index.html):

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

The change by the OP was to assign exports.Example to Example instead of to an new instance. Thus the node.js logic can use the following:

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

Thus the original question is solved.

Take a look at nodeJS modules.

Would be in m.js:

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

In the files you need m.js

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

Hope that helps!

发布评论

评论列表(0)

  1. 暂无评论