一、npm淘宝镜像
npm install -g cnpm --registry=https://registry.npm.taobao.org
二、webpack
http://webpackdoc.com/index.html
http://www.mamicode.com/info-detail-1667301.html
三、CommonJS 引用规范
Node中模块分为两类:一类是Node提供的模块,称为核心模块;
另一类是用户编写的模块,称为文件模块
核心模块部分在Node源代码的编译过程中,编译进了二进制执行文件。在Node进程启动时,部分核心模块就被直接加载进内存中,所以这部分核心模块引入时,文件定位和编译执行这两个步骤可以省略掉,并且在路径分析中优先判断,所以它的加载速度是最快的。
- 一、查找(包/模块来源)优先级:nodejs内置模块 > 安装在node_modules目录下的第三方模块 > 用户自定义的模块。
- 二、不加后缀的情况:*.js > *.json > *.node(c++编译包) --->fs模块同步阻塞式地判断文件是否存在
- 如果匹配到的名称为目录,则去
package.json
中找main
的指定。如果没找到,则默认以该目录下的index.js、index.json、index.node
为默认目标。
- 如果匹配到的名称为目录,则去
- 三、加后缀则根据指定的后缀来找。
【缓存加载】
不论是核心模块
还是文件模块
,require()方法对相同模块的二次加载都一律采用缓存优先的方式,这是第一优先级的。不同之处在于核心模块
的缓存检查先于文件模块
的缓存检查
【标识符分析】
require()方法接受一个标识符作为参数。在Node实现中,正是基于这样一个标识符进行模块查找的。
模块标识符在Node中主要分为以下几类:
- [1]核心模块:如
http、fs、path
等; - [2]相对路径文件模块:
./
或../
开始的; - [3]绝对路径文件模块:以
/
开始的; - [4]非路径形式的文件模块:如自定义的
connect
模块
根据参数的不同格式,require命令去不同路径寻找模块文件
1、如果参数字符串以“/”开头,则表示加载的是一个位于绝对路径的模块文件。比如,require('/home/marco/foo.js')将加载/home/marco/foo.js
2、如果参数字符串以“./”开头,则表示加载的是一个位于相对路径(跟当前执行脚本的位置相比)的模块文件。比如,require('./circle')将加载当前脚本同一目录的circle.js
3、如果参数字符串不以“./“或”/“开头,则表示加载的是一个默认提供的核心模块(位于Node的系统安装目录中),或者一个位于各级node_modules目录的已安装模块(全局安装或局部安装)
[注意]:如果是当前路径下的文件模块,一定要以
./
开头,否则nodejs会试图去加载核心模块,或node_modules内的模块
【C/C++模块的编译】
Node调用process.dlopen()
方法进行加载和执行。在Node的架构下,dlopen()方法在Windows和*nix平台下分别有不同的实现,通过libuv兼容层进行了封装
参考:Commonjs规范及Node模块实现