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 相关文章推荐
Nodejs极简入门教程(二):定时器
Oct 25 NodeJs
NodeJS使用jQuery选择器操作DOM
Feb 13 NodeJs
nodejs实现bigpipe异步加载页面方案
Jan 26 NodeJs
你一定会收藏的Nodejs代码片段
Feb 04 NodeJs
nodejs集成sqlite使用示例
Jun 05 NodeJs
nodejs利用ajax实现网页无刷新上传图片实例代码
Jun 06 NodeJs
详解Nodejs之npm&package.json
Jun 15 NodeJs
在Debian(Raspberry Pi)树莓派上安装NodeJS的教程详解
Sep 19 NodeJs
nodejs使用http模块发送get与post请求的方法示例
Jan 08 NodeJs
Nodejs 和 Electron ubuntu下快速安装过程
May 04 NodeJs
nodejs之koa2请求示例(GET,POST)
Aug 07 NodeJs
nodejs同步调用获取mysql数据时遇到的大坑
Mar 02 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投票程序源码
2007/03/11 PHP
一些PHP Coding Tips(php小技巧)[2011/04/02最后更新]
2011/05/02 PHP
php压缩和解压缩字符串的方法
2015/03/14 PHP
详解no input file specified 三种解决方法
2019/11/29 PHP
图片之间的切换
2006/06/26 Javascript
js中if语句的几种优化代码写法
2011/03/12 Javascript
js前台分页显示后端JAVA数据响应
2013/03/18 Javascript
jquery五角星评分插件示例分享
2014/02/21 Javascript
js子页面获取父页面数据示例
2014/05/15 Javascript
5个JavaScript经典面试题
2014/10/13 Javascript
javascript判断css3动画结束 css3动画结束的回调函数
2015/03/10 Javascript
被遗忘的javascript的slice() 方法
2015/04/20 Javascript
js密码强度检测
2016/01/07 Javascript
jQuery表格插件datatables用法汇总
2016/03/29 Javascript
图片上传之FileAPI与NodeJs
2017/01/24 NodeJs
分分钟玩转Vue.js组件(二)
2017/03/01 Javascript
NodeJS学习笔记之Module的简介
2017/03/24 NodeJs
基于构造函数的五种继承方法小结
2017/07/27 Javascript
jquery-file-upload 文件上传带进度条效果
2017/11/21 jQuery
React数据传递之组件内部通信的方法
2017/12/31 Javascript
解决vue中修改了数据但视图无法更新的情况
2018/08/27 Javascript
[01:45]典藏宝瓶2+祈求者身心——这就是DOTA2TI9总奖金突破3000万美元的秘密
2019/07/21 DOTA
详解用TensorFlow实现逻辑回归算法
2018/05/02 Python
Django框架实现逆向解析url的方法
2018/07/04 Python
使用python爬取抖音视频列表信息
2019/07/15 Python
Python3将数据保存为txt文件的方法
2019/09/12 Python
Python进程间通信 multiProcessing Queue队列实现详解
2019/09/23 Python
CSS3 text shadow字体阴影效果
2016/01/08 HTML / CSS
html5使用canvas实现弹幕功能示例
2017/09/11 HTML / CSS
SCHIESSER荷兰官方网站:德国内衣专家
2020/10/09 全球购物
医院后勤自我鉴定
2013/10/13 职场文书
中华魂演讲稿
2014/05/13 职场文书
敬老院标语
2014/06/27 职场文书
关于教师节的广播稿
2014/09/10 职场文书
2014年班务工作总结
2014/12/02 职场文书
地方课程教学计划
2015/01/19 职场文书