2013-02-16 93 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 

注:這需要節點。

相關問題