模块化概念
Node 中规定一个 JavaScript 文件就是一个模块,默认情况下在一个模块内部无法获取另一个模块的变量和函数在。可以使用 exports 对象将模块的变量和函数进行导出,在其他模块中使用 require 函数导入该模块,从而使用该模块的变量和函数。
一、模块化导出导入方式一
ModuleA.js
var property = "Is Property";
function fun() {
console.log("Is Fun");
}
exports.property = property;
exports.fun = fun;
ModuleB.js
var moduleA = require("./ModuleA");
console.log(moduleA.property);
moduleA.fun();
二、模块化导入导出方式二
ModuleA.js
var property = "Is Property";
function fun() {
console.log("Is Fun");
}
module.exports.property = property;
module.exports.fun = fun;
ModuleB.js
var moduleA = require("./ModuleA");
console.log(moduleA.property);
moduleA.fun();
exports 是 module.exports 的别名,使用 exports 和 module.exports 导出同一个变量或函数,最终以 module.exports 为准。
系统模块
Node 运行环境提供了很多 API,这些 API 都是以模块的形式存在,这些模块称为系统模块。
第三方模块
有特定功能的非系统模块都是第三方模块,第三方模块有两种存在形式。第一种是以 JavaScript 文件的形式存在,提供实现具体功能的 API 接口。第二种形式是以命令行的形式存在,辅助项目开发。
使用 npm 来管理第三方模块,npm 本身也是一个以命令行形式存在的第三方模块。第三方模块可以全局安装也可以本地安装,全局安装可以在所有项目中使用,本地安装只能在当前项目中使用。一般以命令行形式存在的模块全局安装,以 JavaScript 文件形式存在的模块本地安装。
- 下载模块:npm install 模块名称
- 卸载模块:npm unintall package 模块名称
一、第三方模块 nrm
默认情况下使用 npm 下载第三方模块会去远程仓库下载(npmjs.com),下载速度很慢,nrn 能够切换下载路径。
// 全局安装 nrm
npm install nrm -g;
// 查看所有现在镜像
nrm ls;
// 切换下载路径为 taobao
nrm use taobao;
package.json 文件
package.json 文件记录了项目依赖的所有模块,以及模块的信息。使用 npm init -y 命令可以在当前项目中生成 package.json 文件。
模块加载机制
使用 require 函数引入模块,如果是完整路径则直接引入。如果模块后缀省略先去找同名的 JavaScript 文件,再去找同名的文件夹,如果有同名文件夹怎在该文件夹下查找是否用 index.js 文件。如果文件夹下没有 index.js 文件就去找当前文件夹下的 package.json 文件的 mian 选项中的入口文件,如果没有找到入口文件或者没有指定入口文件则会报错。
当模块没有路径也没有后缀时,Node 会认为该模块是系统模块,在 node_module 文件夹中查找是否有相同名字的 JavaScript 文件,再去查找是否有相同名字的文件夹,在文件夹中查找 index.js 文件,如果没有 index.js 文件,则查看文件夹下的 package.json 的 main 选项确定入口文件。