NodeJS模块与ES6模块系统语法及注意点详解


Posted in NodeJs onJanuary 04, 2019

社区模块规范:

1.CommonJS规范

规范实现者:

NodeJS 服务端

Browserify 浏览器

2.AMD规范 全称 异步模块定义

规范实现者:

RequireJS 浏览器

3.CMD规范 通用模块定义

规范实现者:

seaJS 服务端和浏览器通用

官方模块规范

1.ESM规范 就是ES6 Module

各浏览器和服务端

目前常用的就是浏览器端的RequireJS、NodeJS、以及ESM

CommonJS语法分析

module.export

关键

1.module.exports实质上是一个对象,最后模块导出的对象就是这个引用指向的对象

module.export.key = value
 // eg: 
 module.export.a = 1; 
 // 整体管理导出,此时exports与module.exports指向断开,导致exports上的属性被忽略
 module.export = {
 a:1,
 b:1
 }

2.exports是一个module.export的助手变量,用于就地导出,两者默认指向同一对象,即module.exports === exports true

// 像比较长的程序,写完所有之后,再去找到需要导出的变量再移到低端的export.module上逐个添加,是相当麻烦,一般在变量下决定是否导出
 //eg 
 let fA = function () {

 }
 module.exports.fA = fA
 let fB = function () {

 }
 module.exports.fB = fB

 // exports 简洁很多
 let fA = function () {

 }
 module.fA = fA
 let fB = function () {

 }
 module.fB = fB

3.在逐个导出时使用exports,而在导出一个对象时,使用module.exports,不建议混用,如果需要,可以作一下处理:

// 在最后导出时将exports对象和module.exports对象合并
 exports.a = 1
 module.exports = Object.assign({
 b : 1
 },exports)

require

关键:

1.模块区分,知道即可

let f = require('url')

// 核心模块,第三方模块(npm安装),指定模块名即可
 let f = require ('modulename')
 // 自定义模块,需指定相对或者绝对路径
 let f = require('absolutePATH/relativeAPTH')

2.查找时,没有后缀名的会尝试添加.js、.json、.node,这里可以稍微偷个懒

let f = require('./circle')
 // 等同于
 let f = require('./circle.js')

ESM语法分析:

export var/function/class

关键:

1.导出值和内部值要有对于关系,即

// error
 export 1

 // error
 let m = 1
 export m

 // correct
 export let m = 1

 // correct
 let m = 1;
 export {m}

直接在声明时导出或者用一个{}包裹导出

2.export default 用于导出一个默认值,使得用户可以不需要知道内部导出变量名称即可使用

PS: 一个模块只能有一个默认导出

export default 等同 export {add as default}
 // 不能接变量声明语句
 export default let a = 1

普通导出与默认导出使用的区别

// 普通导出的导入使用
 export {f}
 import {f} from 'fmod'

 // 默认导出的导入使用,可以无需知道导出模块的内部变量名,任意重命名
 export default f
 import c from 'fmod'

3.导出值与模块值是动态绑定的

export let foo = 'bar';
// 500毫秒后,其他模块拿到的foo值会变成bar
setTimeout(() => foo = 'baz', 500);

import用法

关键:

1.导入非默认变量时需要使用{}语法,并且变量要与导出时变量一致

// 普通导出的导入使用
 export {f}
 import {f} from 'fmod'

2.导入默认变量时,省略{},并且可以重命名导出变量

// 默认导出的导入使用,可以无需知道导出模块的内部变量名,任意重命名
 export default f
 import c from 'fmod'

3.可以使用*导出整体模块

// circle.js
 export let radius = 1
 export let area = 2*PI*radius
 // main.js
 import * as circle from './circle.js'
 circle.radius
 circle.area

4.可以使用,同时导出默认导出和常规导出

import _,{each, forEach} from 'lodash'

5.多次import同一模块,只会执行一次

6.import可以与require混用,但是其在静态分析阶段执行,也就是会先于require加载,这在要求一定的导入顺序时要注意

export { foo, bar } from 'my_module';

// 可以简单理解为,但是合并写法等同于没有在当前模块中导入my_module,即无法使用
import { foo, bar } from 'my_module';
export { foo, bar };

ESM加载CommmonJS

关键:

1.CommonJS模块输出对象module.exports将会被Node转换成默认导出

// 导出
 export default module.exports
 // 导入,类似导入默认
 import m from './m'

2.此时CommonJS模块变量遵循其规则,不会动态绑定

module.exports = 123;
 setTimeout(() => module.exports = null,500)
 //500毫秒后,module.exports仍然是123

3.由于CommonJS模块运行时,才会确定输出的module.exports对象,而ESM在编译时就要确定接口,导入时,不允许解构语法

import {readFile} from 'fs'

解决方案:

//整体导入 
 import * as express from 'express'
 const app = express.default()
 
 //默认导入,更优
 import express from 'express'
 const app = express()

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

NodeJs 相关文章推荐
PHPStorm 2020.1 调试 Nodejs的多种方法详解
Sep 17 NodeJs
Nodejs中调用系统命令、Shell脚本和Python脚本的方法和实例
Jan 01 NodeJs
nodejs中实现阻塞实例
Mar 24 NodeJs
快速掌握Node.js之Window下配置NodeJs环境
Mar 21 NodeJs
mac下的nodejs环境安装的步骤
May 24 NodeJs
详解redis在nodejs中的应用
May 02 NodeJs
webstorm中配置nodejs环境及npm的实例
May 15 NodeJs
nodeJS进程管理器pm2的使用
Jan 09 NodeJs
关于NodeJS中的循环引用详解
Jul 23 NodeJs
nodejs读取图片返回给浏览器显示
Jul 25 NodeJs
Nodejs监听日志文件的变化的过程解析
Aug 04 NodeJs
分享node.js实现简单登录注册的具体代码
Apr 26 NodeJs
nodejs 使用http进行post或get请求的实例(携带cookie)
Jan 03 #NodeJs
详解nodejs 配置文件处理方案
Jan 02 #NodeJs
nodejs基础之多进程实例详解
Dec 27 #NodeJs
nodejs基础之常用工具模块util用法分析
Dec 26 #NodeJs
nodejs基础之buffer缓冲区用法分析
Dec 26 #NodeJs
nodejs异步编程基础之回调函数用法分析
Dec 26 #NodeJs
Nodejs处理异常操作示例
Dec 25 #NodeJs
You might like
php中批量修改文件后缀名的函数代码
2011/10/23 PHP
PHP PDOStatement:bindParam插入数据错误问题分析
2013/11/13 PHP
PHP文字转图片功能原理与实现方法分析
2017/08/31 PHP
Yii框架响应组件用法实例分析
2019/09/04 PHP
PHP Swoole异步MySQL客户端实现方法示例
2019/10/24 PHP
js 提交和设置表单的值
2008/12/19 Javascript
javascript 不间断的图片滚动并可点击
2010/01/15 Javascript
firefox下jquery ajax返回object XMLDocument处理方法
2014/01/26 Javascript
js 左右悬浮对联广告代码示例
2014/12/12 Javascript
NodeJs中的VM模块详解
2015/05/06 NodeJs
jQuery插件实现带圆点的焦点图片轮播切换
2016/01/18 Javascript
WebGL利用FBO完成立方体贴图效果完整实例(附demo源码下载)
2016/01/26 Javascript
ionic js 复选框 与普通的 HTML 复选框到底有没区别
2016/06/06 Javascript
NodeJS配置HTTPS服务实例分享
2017/02/19 NodeJs
vue地区选择组件教程详解
2018/05/04 Javascript
JS+H5 Canvas实现时钟效果
2018/07/20 Javascript
Vue 菜单栏点击切换单个class(高亮)的方法
2018/08/22 Javascript
Vue组件通信入门之Provide和Inject机制
2019/12/29 Javascript
JavaScript实现多文件下载方法解析
2020/08/07 Javascript
[57:16]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS VG第二场
2014/05/26 DOTA
[33:28]完美世界DOTA2联赛PWL S3 PXG vs GXR 第三场 12.19
2020/12/24 DOTA
[01:16:50]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第一场 3月7日
2021/03/11 DOTA
Python中顺序表的实现简单代码分享
2018/01/09 Python
基于python 二维数组及画图的实例详解
2018/04/03 Python
Python3.5 Pandas模块之DataFrame用法实例分析
2019/04/23 Python
Pandas实现dataframe和np.array的相互转换
2019/11/30 Python
Tensorflow 使用pb文件保存(恢复)模型计算图和参数实例详解
2020/02/11 Python
毕业生个人求职的自我评价
2013/10/28 职场文书
银行开业庆典方案
2014/02/06 职场文书
卖车协议书
2014/04/21 职场文书
节能标语大全
2014/06/21 职场文书
党的群众路线教育实践活动个人整改落实情况汇报
2014/10/28 职场文书
公司慰问信范文
2015/03/23 职场文书
初中历史教学反思
2016/02/19 职场文书
python基础之类方法和静态方法
2021/10/24 Python
《勇者辞职不干了》上卷BD发售宣传CM公开
2022/04/08 日漫