2013-02-16 52 views
6

目的:制作Node.js的模块或Requirejs AMD模块,从一个普通的旧JavaScript文件是这样的:如何在Node.js中包含一个不是模块的文件(以创建它的一个模块)?

var foo = function() {}; 

没有控制,我不能编辑foo.js

为什么foo是是第一if内一个普通的空对象?如何在模块中“包含”普通的JavaScript文件?文件mymodule.js:装有require

(function(root) { 
    if(typeof exports === 'object') { // Node.js 
     var foo = require('./foo'); 

     console.log(foo); // { } 
    } else if (typeof define === 'function' && define.amd) { // RequireJS AMD 
     define(['foo'], function() { 
      return foo; 
     }); 
    } 
}()); 
+0

我很困惑,你想用你的代码中的'RequireJS'部分做什么? – loganfsmyth 2013-02-16 19:43:48

回答

4

节点模块必须填充一个exports对象与模块要公开一切。在你的情况下,当你需要这个文件时,什么都没有添加到exports,因此它显示为空。所以简短的回答是,你需要以某种方式修改foo.js的内容。如果你不能手动完成,那么你需要通过编程来完成。你为什么无法控制它?

,你在编程,使其正确的模块所需要的代码,如果foo.js包裹的内容,最简单的幸福。

// Add an 'exports' line to the end of the module before loading it. 
var originalFoo = fs.readFileSync('./foo.js', 'utf8'); 
fs.writeFileSync('./foo-module.js', originalFoo + "\nexports.foo = foo;"); 
var foo = require('./foo-module.js'); 
+1

我使用read + eval解决了这个问题。 Noo需要将文件写回。我无法编辑foo.js,因为它是一个依赖项(自动下载)。 – gremo 2013-02-16 22:04:30

+0

这让我无时间工作 - 我的目标是通过加载所有需要的全局变量来调试mocha的特定测试,我可以通过调用我想要调试的测试来解决此问题,并将所需文件路径的数组提供给函数这就是所有的eval – 2017-09-28 16:37:44

0

你可以尝试:

var fs = require('fs'); 

var foo = fs.readFileSync('foo.js', 'utf8') // Or request it somehow, just get it as a string 

foo += "module.exports.foo = module.exports = foo;"; 

fs.writeFileSync('fooModule.js',foo); 

var foo = require('./fooModule'); 

// foo() and foo.foo() are both the same 

注:这需要节点。

相关问题