NodeJS本地模块怎么获取?

公司最近在整前后端分离,本人对 NodeJS 并不是太了解,本人是后端的。

在整理前端应用框架的时候(基于Express),碰到一个很简单问题,具体问题如下:

我在项目根目录下新建了一个 lib 文件夹,这个文件夹中有很多自己的模块。问题来了,怎么把这些自己的模块其它模块里去?

有没有方便的引入方法?比如:

jsvar config = require('lib/config');
var util = require('lib/util');

require node_modules中的模块一样方便的方法。

jsvar fs = require('fs');

有没有变通的解决方法,能方便引入,因为后面考虑做业务模块化,很多模块层级可能比较深,这样的话,相对路径依赖应该不太合适吧?

阅读 8.7k
5 个回答

一些点:

  1. require默认使用__dirname作为起始路径。参见module的算法解释
  2. fs默认采用process.cwd()作为起始路径。参见fs的文档

如果LZ问的是如何定位项目根目录,并有一个通用引用方式的话,有两种常见的做法。

1

app.js

var _rootDir = __dirname;
Object.defineProperty(global, "ROOT_DIR", {
    get: function(){
        return _rootDir;
    }
});

module.js

var path = require("path") ;
var ADDR_PREFIX = path.join(global.ROOT_DIR , "to/your/path") ;

2

module.js

var path = require("path") ;
var ADDR_PREFIX = path.join(process.cwd() , "to/your/path") ;

第一个鲁棒性更强。app.js所在的__dirname是一个绝对路径地址,而process.cwd()(或者路径串中的.暗示的路径)则有可能变化。

你可以把代码放到node_modules里。因为你想要的是:如果模块名不是路径,也不是内置模块,Node将试图去当前目录的node_modules文件夹里搜索。如果当前目录的node_modules里没有找到,Node会从父目录的node_modules里搜索,这样递归下去直到根目录。

下面写一个简单的栗子(先是项目目录):

|-node
    |-node_module
        |-test
            |-a.js
            |-index.js
    |-app.js

test文件夹中a.jsindex.js的代码分别是:

// a.js
var Person = function () {};

Person.prototype.say = function () {
    return "Hello World!";
}

module.exports = Person;
// index.js
var a = require('./a');

module.exports = a;

然后是app.js的代码:

var test = require('test'); // 不再使用路径的方式去加载模块

var obj = new test;

console.log(obj.say());

最后 ok ,运行成功!

clipboard.png

  1. npm install 也是支持 git 地址的,所以把你的本地模块独立出来放到 Git 仓库中也是一个不错的选择
  2. npm Enterprise 官方推出的 npm 企业版服务正是为了方便组织内部分享模块而提供的,我想唯一的不足可能就是它是收费服务吧
  3. 除了使用 npm Enterprise 外,使用 CNPM 工具也是可以达到同样的效果,而且它是免费的。如果要了解更多可以参考这篇教程:CNPM搭建私有的NPM服务

exports
module.exports

process.cwd(); 可以获取当前应用执行的目录,这样可以在一定程度上获取根目录。

|-node
    |-node_module
        |-test
            |-a.js
            |-index.js
    |-lib
        |-utils.js
    |-app.js

如上目录结构,根目录下面lib目录中有一个utils.js工具模块,使用以下代码可以引入该模块:

jsvar basePath = process.cwd();
var utils = require(basePath + '/lib/utils');
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题