没有苦难的人生没有任何意义,为中华民族的伟大复兴而读书。
前情回顾
上篇文章分享了的一个实现小程序的持续集成
的问题,小程序的获取用户信息的接口getUserInfo
将在2021-04-13
号被getUserProfile
替代,所以的需要考虑一下项目中是否需要更新了。
今天要重新回顾一下commonJS规范
及nodejs的模块儿机制
,这篇讲不完的话, 下篇会接着聊这个话题。
规范和模块机制产生的背景
Javascript在很长一段时间内被认为是一种网页脚本
。web1.0
时代大致用来做表单校验或者做网页特效。web2.0
时代,慢慢被重视起来,大致经历了工具类库(jquey用来兼容浏览器)
-->组件(开发功能模块)
-->框架(功能模块儿组织)
-->应用(业务模块组织)
这么几个过程的变迁。
在这种变迁的过程中,js不断的被抽象、聚合。相对于用script
标签组织代码,抽象后的js能够更好的组织业务逻辑
,尤其是node
出现之后,js的前端应用更加活跃,慢慢的社区为Javascript定制了相应的规范。
Commonjs规范的远景
Commonjs规范
的一个出发点是:希望javascript能够运行在任何地方
。
在实际工作中,Javascript的工作场景基本仅限于宿主浏览器中API支持程度,虽然web2.0
以后,HTML5
崭露头角后,浏览器中出现了很多新的,强大的API, 但是相对于其他语言,JavaScript本身的规范还是非常薄弱。
没有模块系统
。标准库少
。没有标准接口
。缺乏包管理系统
。
Commonjs规范
为JavaScript开发大型应用指明了道路,这些规范包括:模块
,二进制
,Buffer
,字符集
,I/O流
,文件系统
,套接字
...
Commonjs规范的使用
Commonjs规范
的使用非常简单,主要有模块引用
,模块定义
,模块标识
三个部分。
模块引用
。示例代码:
// 采用require方法引入模块API
var fs = require('fs')
模块定义
。在模块中存在一个module
对象,代表模块儿本身,同时上下文环境提供了一个exports
对象用于导出当前模块的方法或变量,并且是唯一导出的出口
。同时,exports
是module
的属性。在Node
中一个文件就是一个模块。示例代码:
// saveToken.js
const fs = require('fs')
module.exports = function (filename,readStream){
return new Promise(resolve=>{
const writeStream = fs.createWriteStream(filename);
writeStream.on('finish',()=>{
setTimeout(resolve,100);
})
readStream.pipe(writeStream)
})
}
模块标识
。模块标识其实就是传递给require()
方法的参数,必须是合格小驼峰命名的字符串,或者以.
,..
开头的相对路径或绝对路径,可以忽略后缀名js
。
这样一来,每个模块具有独立的空间且互不干扰,整个业务逻辑也显得清晰。
Node模块儿
在Node中,模块儿可以分为两大类,一类是Node提供的模块成为核心模块
;另一类是用户编写的模块,成为文件模块
。
在Node中引入模块,大致会经历这么几个过程:
路径分析
文件定位
编译执行
今天先分享到这里,下篇文章会讲解这几个过程
总结
CommonJs规范
背景CommonJs规范
可以解决什么问题CommonJs规范
简单使用
javascript基础知识总结