本篇文章介绍nodejs的模块引入与加载机制。
(一)模块引入与常用内置对象
1、module
nodejs认为一个js文件就是一个模块,每个模块都有一个全局对象module,同时module对象中有一个对象exports。
这个对象被加载一次之后会别缓存,里面提供了模块的父子模块关联信息,即父模块被那些模块引用,子模块引用了那些模块。
Module {
id: '.',
exports: {},
parent: null,
filename: 'E:\\workspace\\myRequre.js',
loaded: false,
children: [],
【nodejs快速入门(三)-模块引入与加载机制】paths: [ 'E:\\workspace\\ node_modules', 'E:\\workspace\\node_modules', 'E:\\node_modules' ]
}
2、exports
exports是module.exports对象的别名,提供便捷的属性和方法设置。如
exports.add = function(v1,v2){ return v1 + v2;
} 模块中的module.exports对象就增加了add方法。
3、require
require可以加载文件模块(.js、.code、.json)和nodejs核心模块,最终获取到的是module.exports对象。第一次加载的时候执行代码,第二次从缓存中获取module.exports对象,如果没有发现指定模块就报错not find module。
下面模拟require对象:
myRequire.js
function MyRequre(path){ function Module(){
this.exports = {};
} var fs = require('fs');
var source = fs.readFileSync(path,'utf8');
var package = "(function(exports,module){"+source+" return module.exports;
})";
var callback = eval(package);
var module = new Module();
var fn= callback(module.exports, module);
return fn;
}
fnModule.js
module.exports=function(){
return 123;
};
调用
var fn = MyRequre('./foo.js');
console.log(fn());
结果:123
4、nodejs的核心模块
文章图片
核心模块的源码都在lib子目录中,为了提高运行速度,他们按照的时候,都会被编译成二进制文件。
模块加载机制
①
5、package
包是将一堆的文件联系起来的一种机制,nodejs就是在模块的基础之上进一步组织javascript代码。
文章图片
规范的包目录结构
文件/目录 | 说明 |
package.json | 包描述文件,不仅开发者阅读使用,nodejs也使用 |
bin | 存放可执行的文件目录 |
lib | 存放JavaScript的目录 |
doc | 存放文档目录 |
test | 单元测试用例代码 |
{
"name": "test",
"version": "0.0.1",
"description": "",
"main": "index.js",
"keywords": [
],
"author": "KingNigel",
"repository": {
"type": "git",
"url": "https://github.com/KingNigel/test.git"
},
"bugs": {
"url": "https://github.com/KingNigel/test/issues"
},
"license": "MIT",
"devDependencies": {
"express": "4.*"
},
"dependencies": {
"express": "4.*"
}
}
属性 | 描述 |
name | 包名 |
description | 包简介 |
version | 包版本号 |
keywords | 关键词组,在npm中分类搜索使用 |
author | 包作者 |
main | 配置包入口,默认是根目录下index.js |
dependencies | 包依赖项,npm会自动加载依赖包 |
scripts | 指定运行脚本命令npmn命令行 |
全球最大的第三方模块生态系统(http://www.npmjs.com),package是一个规范,npm是实现,作用是暗装和管理node模块。
基础使用命令
npm install 包名 —— 当执行该命令时,回到npm网站找到github地址,下载压缩包,并加压。然后,在npm当前目录下查找node_modules目录,将解压文件放到该目录下,如果没有找打该目录就创建。
npm install -g 包名 —— 表示全局全装,npm会设置一个按照目录,将包放到该目录中,并提供命令行工具。
npm i -S包名@版本号 —— 添加依赖项到package.json文件的denpendencies字段中, 生产环境使用。
npm i -D 包含@版本号 —— 添加依赖项到package.json文件的devDenpendencies字段中,开发环境使用。
npm config set prefix —— 修改全局按照目录,不建议使用,建议到npm目录下的.npmrc文件中修改 prefix = 安装目录,在windows的全局环境path中把按照目录配置进去。
6、文件操作
①箭头函数ECMAScript6.0 支持的一种函数语法
函数有一个参数,有返回值写法: var fn = v => v ;第一个v表示参数 ,第二个v表示返回值。
函数没有参数,有返回值 var fn = () => v
函数有多个参数,有返回值 var fn = (v1,v2) => {return v1 + v2}
函数有多个参数,没有返回值 var fn = (v1,v2) => {console.log(v1); console.log(v2)}
②fs文件读写
fs是nodejs的一个核心模块,用于读文件操作。内部的方法一般都是成对出现的,分为同步和异步。
(1)fs.readFile(filepath, [options], callback)
filepath 文件路径
options可选参数,object {"encoding":"uft8","flag":"r"} ,一般使用“utf8”
callback = function(err,data){} 参数err:表示读文件错误时的返回的错误信息,默认值为null;data表示读文件成功返回的数据,默认值为undefined。
var data = https://www.it610.com/article/fs.readFileSync(filepath,[options])此方法为异步方法, 直接返回数据。
(2)fs.access(path,[mode], callback) 判断文件是否存在
model一般不用写; callback= function(err){} 只有一个err参数。
模拟fs读文件操作
在node_modules目录中创建一个readf文件夹,该文件夹目录中创建一个package.json
{
"name": "readf",
"version": "0.0.1",
"description": "",
"main": "readf.js",
"keywords": [
],
"author": "KingNigel",
"repository": {
"type": "git",
"url": "https://github.com/KingNigel/test.git"
},
"bugs": {
"url": "https://github.com/KingNigel/test/issues"
},
"license": "MIT",
"devDependencies": {
"express": "4.*"
},
"dependencies": {
"express": "4.*"
}
}
再创建一个read.js文件
var fs=require('fs');
var rf=function(path,callback){fs.access(path, (err) => {
if(err){
callback(err);
}
fs.readFile(path,'utf8',(err,data)=>{
callback(null,data)
})
});
}
module.exports=rf;
在node_modules的同级目录下创建一个test.js
var fr = require("readf");
fr("./package.json",function(err,data){
console.log(data);
});
结果就是package.json中的内容。