我有一个相对简单的JavaScript文件(称之为foo.js),它有3个函数,由浏览器中的第二个JS文件调用。在foo.js中还有一些其他函数,但它们仅在内部使用。
现在foo.js也需要能够在node.js中运行的JS文件使用。同样的事情,只需要访问三个基本功能。
所以我在这三个函数周围添加了module.exports,如下所示:
module.exports = {
init_foo: function (bar){
return JSON.parse(bar);
},
export_foo: function (foobar){
return JSON.stringify(foobar);
},
switch_foo: function (boofar){
switch(boofar)
{
case 'A':
return 1;
case 'B':
return 2;
default:
return 3;
}
}
};
所以现在我的node.js文件可以使用
获取代码var foo = require('./foo.js');
但当然浏览器代码不能再使用它,会出错。在寻找解决方案时,我找到browserify,但我似乎无法让它工作(即使在做了建议的教程时仍然会返回一个空文件,猜测它与该集合有关)我正在使用的系统,只是不确定是什么),似乎它比我需要的更复杂(不想浏览整个浏览器JavaScript代码,但不能浏览器化foo.js,必须制作一个需要foo.js的新JS文件并使用它然后浏览它,有效地添加一个以前不需要的中间人。)
看看我想用node.js和浏览器访问的代码是如何相对简单的,有一个简单的方法吗? (只是编写代码两次不是解决方案,它只是简单的代码,但我只想编辑一次,以便将更改传播到两个位置)。
答案 0 :(得分:1)
使用像browserify这样的专用数据包可能是最好的,但对于像你这样的小东西,以下可能更适合。 (我在我的primesieve模块中使用它)
var myModule = (function() {
return {
init_foo: function (bar){
return JSON.parse(bar);
},
export_foo: function (foobar){
return JSON.stringify(foobar);
},
switch_foo: function (boofar){
switch(boofar)
{
case 'A':
return 1;
case 'B':
return 2;
default:
return 3;
}
}
};
})();
if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
module.exports = myModule;
} else {
if (typeof define === 'function' && define.amd) {
define([], function() {
return myModule;
});
} else {
window.myModule = myModule;
}
}
已经过了一段时间,可能已经有了更好的方法,但它很小而且很简单,对我有用。
答案 1 :(得分:-1)
Welp,你能做的一件事就是只分配'module'的属性(如果存在)。并希望没有其他JavaScript将其作为全局变量引入您的浏览器环境。
(function() {
var exports
...
if (this.hasOwnProperty('module'))
module.exports = exports
})()
请注意,this
有全局对象。