读书人

node的模块加载与治理

发布时间: 2013-10-23 11:39:13 作者: rapoo

node的模块加载与管理

以下几篇文档比较重要:

CommonJS module spec

CommonJS package spec

npm install

node package.json

node module reference

node模块

node实现了CommonJS的模块规范和包结构规范

模块规范(module spec)主要是定义不同模块间require,exports,module等API

包结构规范(package spec)主要是定义目录结构,以及package.json的格式。另外node在package.json中还扩展了一些自定义的字段,其中最重要的就是main,后面会提到,当require一个目录时,该字段描述了哪个js文件作为入口

实际上,即使不遵循包结构规范,比如没有package.json,js文件之间相互引用也是可以的,比如:

node的模块加载与治理

这里只有一个单独的calculator.js,显然谈不上什么包结构,但是这个模块也完全可以被其他模块引用


package.json是核心,其中描述了该模块的入口,模块依赖的模块等。用npm install命令,可以自动读取分析package.json中描述的依赖,并安装到本地仓库(放在node_modules下)

模块安装

安装模块通常有3种情况

全局安装

典型的比如grunt-cli,使用npm install -g xxx命令。有些公用的模块,后续需要用命令行来执行的,一般用这种方式安装

自动分析安装所需依赖

这种不需要在命令行参数里指定目标module name,只要执行npm install,就会读取并分析package.json中声明的依赖,然后下载安装

将自己开发的模块打包

如下目录

node的模块加载与治理

在test_npm中,是这样引用test模块的:


其实除非是为了将自己开发的模块发布到npm registry或是npm source上,一般没必要安装本地模块,因为可以通过相对路径或者绝对路径加载到

模块加载规则

这个特别重要,要详细看这篇文档:node module reference

大致上有3种情况:

require("./abc");require("../def");require("/ghi");

这种是根据路径加载

总结

    正式开发的项目,显然应该按照node的包结构规范来组织目录。最明显的好处是,可以在package.json里声明依赖,然后就可以很方便地用npm install来安装所需的第三方模块对于server端开发来说,自己写的代码,用路径来require就挺好,最好不要用模块名来require。否则的话,模块一修改,就需要重新npm install,非常麻烦,又没有明显的好处。相反用路径来require,模块的修改马上就能体现出来,开发很方便个人感觉,相对路径比绝对路径更好。只要应用的目录规划没变,只是部署的路径改变,相对路径都不需要修改


读书人网 >编程

热点推荐