node.js 模块引入
require 引入模块-commonjs规范
核心模块
js
require('http');// 引入 http 模块
- 引入的模块会先从当前目录 node_modules 找,没有继续往上一级目录找,直到根目录,没有则报错
- 文件模块:一个模块就是一个js文件
- 引入的是路径必须以 ./ 或 ../ 开头
- 引入后返回一个对象,返回的就是引入模块的返回值
js
var md = require('./02-module.js');// 引入本地模块 .js可以省略
每一个 js 文件模块都有一个文件作用域,无法返回引入模块的变量
exports 暴露给外部的变量
js
exports.变量名 = '';// 另一个文件即可访问该变量
引入自定义模块
- node_modules 下文件夹名字为模块名字, require 引入文件夹名字
- nodejs会自动找到文件夹下的 index.js 文件。如果不是 index 会报错
- 修改模块文件夹下 package.json 的 main 参数可以设置引入时的 index 为其他名字
模块的参数
js
console.log(arguments.callee + ''); // 当前函数 + '' 隐式调用 toString
// 函数最开始添加此代码
function (exports, require, module, __filename, __dirname) {
console.log(arguments.callee + '');
// 函数结尾添加此代码
}
实际上模块中运行的代码都包装在一个函数中,并在执行时传递5个实参
- require:函数,用来引入外部的模块
- exports:将对象或变量暴露到外部
- module
- module 代表这个函数的本身
- exports 就是 module 的属性
- 既可以使用 module.exports 导出,也可以使用 exports 导出
js
module.exports == exports;// true
- __filename:
e:\Web\Node\createHttp.js
当前文件所在路径
- __dirname:
e:\Web\Node
当前文件夹所在路径
exports
exports是module.exports的引用,module.exports是真实存在的,最终返回的是module.exports
js
// 可以用
exports.name = 'xx';
// 不可用
exports = { /* 代码 */ }
// 赋值对象会改变引用地址,实际的 module.exports 对象内的值并没有被修改
// 可用
module.exports.name = 'xx';
// 可用
module.exports = {/* 代码 */}
module = { exports: {} };
exports = module.exports;
exports.age = 22;
console.log(exports, module.exports);
module.exports = {};
console.log(exports, module.exports);
package.json
js
dependencies:{} 依赖,此包依赖另外的哪些包 类型jq插件依赖jq
description: '' 描述
devDependencis: {} 开发环境依赖,生成环境不依赖
homepage: 'http...' 主页
license: '' 权限
main: ''主文件
maintainers: {} 主要贡献者
contributors: 维护者
bugs: 提交bug地址
name: '' 包的名字
version: 版本
keywords: 关键字
repositories: 仓库
os: 系统
"scripts": {
"start": "node ./bin/www", // 用 npm start 启动www.js 只有键为start可以省略 run
"dev":"nodemon ./bin/www" // 用npm run dev 启动 www.js
}