Node.js如何把单个文件夹作为模块加载以及模块缓存

问题1:利用package.json来指定文件夹

  package.json中内容如下:

{ "name" : "some-library",
  "main" : "./lib/hello.js" }
文件目录如下:

Node.js如何把单个文件夹作为模块加载以及模块缓存_第1张图片

require.js内容如下:

var b=require('./some-library');
console.log(b.name);
some-library/lib/hello.js中内容:
exports.name="qinliang";

这时候当在folderModule下执行node require.js时候就会去目录some-libray查找package.json,然后根据package.json映射到some-libray/lib/hello.js中,最后输出'qinliang'

注意:如果在some-library中没有查到package.json,这时候就会默认加载some-library中的index.js/index.node,如下:

Node.js如何把单个文件夹作为模块加载以及模块缓存_第2张图片

其中index.js中的内容是:

exports.name="fkl";
这时候不再打印hello.js中的'qinliang',而是index.js中的'fkl'.

问题2:借助于node-modules目录完成

如果require函数的参数不是相对路径,也不是核心模块名,Node会在当前目录的node_modules子目录下查找,比如下面的代码,Node会尝试查找文件./node_modules/myModule.js:

var myModule = require('myModule.js');
如果没找到,Node会继续在上级目录的node_modules文件夹下查找,如果还没找到就继续向上层目录查找,直到找到对应的模块或者到达根目录。

Node.js如何把单个文件夹作为模块加载以及模块缓存_第3张图片

我们在上面的目录下新建一个path.js,其内容:

console.log(module.paths);
然后我们运行可以看到node.js对于模块的搜寻过程如下:

[ 'C:\\Users\\Administrator\\Desktop\\folderModule\\some-library\\lib\\node_modules',
  'C:\\Users\\Administrator\\Desktop\\folderModule\\some-library\\node_modules',
  'C:\\Users\\Administrator\\Desktop\\folderModule\\node_modules',
  'C:\\Users\\Administrator\\Desktop\\node_modules',
  'C:\\Users\\Administrator\\node_modules',
  'C:\\Users\\node_modules',
  'C:\\node_modules' ]
问题3:模块缓存问题:

新建一个文件my-module.js

console.log('module my_module initializing...');
module.exports = function() {
         console.log('Hi!');
};
console.log('my_module initialized.');
然后在一个主模块中多次调用,我们看到模块只被初始化一次:

var myModuleInstance1 = require('./my-module');
var myModuleInstance2 = require('./my-module');
//两次加载模块
输出为:

module my_module initializing...
my_module initialized.

问题4:最后再强调一下模块循环引用的问题,有兴趣的可以自己查看node.js的循环依赖

你可能感兴趣的:(Node.js如何把单个文件夹作为模块加载以及模块缓存)