nodejs快速入门(三)-模块引入与加载机制

本篇文章介绍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的核心模块
nodejs快速入门(三)-模块引入与加载机制
文章图片

核心模块的源码都在lib子目录中,为了提高运行速度,他们按照的时候,都会被编译成二进制文件。
模块加载机制

5、package
包是将一堆的文件联系起来的一种机制,nodejs就是在模块的基础之上进一步组织javascript代码。
nodejs快速入门(三)-模块引入与加载机制
文章图片

规范的包目录结构
文件/目录 说明
package.json 包描述文件,不仅开发者阅读使用,nodejs也使用
bin 存放可执行的文件目录
lib 存放JavaScript的目录
doc 存放文档目录
test 单元测试用例代码
package.json文件,如
{ "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命令行
5、npm
全球最大的第三方模块生态系统(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中的内容。

    推荐阅读