如何在npm模块中引用本地文件?

时间:2013-01-19 19:02:37

标签: node.js npm

当我使用django压缩器对某些客户端组件进行后处理时,我编写了一个简单的npm模块来预编译我的把手模板,发现我需要发送带有几个js文件的npm模块。

目前我只是假设没有人用全局标志安装它,因为我已经“硬编码”了npm模块本身中这些依赖项的路径

我的npm模块的示例布局

/
* / bin
* /lib/main.js
* /vendor/ember.js

现在在main.js中我想使用ember.js文件...目前我的硬编码方法看起来像这样

var emberjs = fs.readFileSync('node_modules/django-ember-precompile/vendor/ember.js', 'utf8');

再次 - 这只能起作用,因为我假设您将其安装在本地,但我想认为node.js有更合法的方式来获取本地嵌入文件

任何人都知道如何改善这一点,使其更加“全球化”友好?

2 个答案:

答案 0 :(得分:3)

Node.js的一大优势在于您可以快速启动和运行。这种方法的缺点是你被迫适应它所围绕的设计模式。

这是一个示例,您的方法与Nodes方法的区别太大。 Node期望模块中的所有内容都从模块导出中公开,包括模板。

readFileSync移到django-ember-precompile模块中,然后通过lib/main.js中的模块导出公开返回的值。

示例:

package.json
    { 
    "name": "django-ember-precompile",
    "main": "lib/main.js"
    }
lib/main.js
    module.exports.ember = readFileSync('vendor/ember.js')
vendor/ember.js

您可以通过

获取模板
var template = require('django-ember-precompile').ember

这个例子可以改进,但核心思想是一样的。

答案 1 :(得分:2)

您可以做的是获取当前文件的目录并创建相对于该文件的文件路径。

var path = require('path')
, fs = require('fs');

var vendor = path.join(path.dirname(fs.realpathSync(__filename)), '../vendor');
var emberjs = fs.readFileSync(vendor + '/ember.js', 'utf8');

希望有所帮助!