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服务器(4):路由
Dec 18 NodeJs
nodejs实现bigpipe异步加载页面方案
Jan 26 NodeJs
nodejs简单实现操作arduino
Sep 25 NodeJs
Nodejs下用submit提交表单提示cannot post错误的解决方法
Nov 21 NodeJs
nodejs中模块定义实例详解
Mar 18 NodeJs
nodejs服务搭建教程 nodejs访问本地站点文件
Apr 07 NodeJs
Nodejs进阶:express+session实现简易登录身份认证
Apr 24 NodeJs
关于Mac下安装nodejs、npm和cnpm的教程
Apr 11 NodeJs
利用nodeJs anywhere搭建本地服务器环境的方法
May 12 NodeJs
通过nodejs 服务器读取HTML文件渲染到页面的方法
May 17 NodeJs
nodejs读取本地中文json文件出现乱码解决方法
Oct 10 NodeJs
NodeJS加密解密及node-rsa加密解密用法详解
Oct 12 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函数spl_autoload_register()用法和__autoload()介绍
2012/02/04 PHP
php使用curl发送json格式数据实例
2013/12/17 PHP
php读取远程gzip压缩网页的方法
2014/12/29 PHP
用javascript获取textarea中的光标位置
2008/05/06 Javascript
JS 实现双色表格实现代码
2009/11/24 Javascript
jQuery学习笔记之jQuery动画效果
2013/09/09 Javascript
js的.innerHTML = ""IE9下显示有错误的解决方法
2013/09/16 Javascript
JS+CSS实现自动改变切换方向图片幻灯切换效果的方法
2015/03/02 Javascript
3个可以改善用户体验的AngularJS指令介绍
2015/06/18 Javascript
JS实现网页上随滚动条滚动的层效果代码
2015/11/04 Javascript
详解iframe与frame的区别
2016/01/13 Javascript
js中最容易被忽视的事件问题大总结
2016/05/15 Javascript
图片上传之FileAPI与NodeJs
2017/01/24 NodeJs
用file标签实现多图文件上传预览
2017/02/14 Javascript
详解Vue SSR( Vue2 + Koa2 + Webpack4)配置指南
2018/11/13 Javascript
Vue实现商品分类菜单数量提示功能
2019/07/26 Javascript
jQuery表单校验插件validator使用方法详解
2020/02/18 jQuery
[01:10:58]Spirit vs NB Supermajor小组赛 A组败者组决赛 BO3 第二场 6.2
2018/06/03 DOTA
python避免死锁方法实例分析
2015/06/04 Python
python实现JAVA源代码从ANSI到UTF-8的批量转换方法
2015/08/10 Python
vscode 配置 python3开发环境的方法
2019/09/19 Python
Python 词典(Dict) 加载与保存示例
2019/12/06 Python
pytorch 实现打印模型的参数值
2019/12/30 Python
tensorflow对图像进行拼接的例子
2020/02/05 Python
Python调用.net动态库实现过程解析
2020/06/05 Python
Matplotlib中%matplotlib inline如何使用
2020/07/28 Python
Python 执行矩阵与线性代数运算
2020/08/01 Python
html5拖曳操作 HTML5实现网页元素的拖放操作
2013/01/02 HTML / CSS
农业生产宣传标语
2014/10/08 职场文书
街道党风廉政建设调研报告
2015/01/01 职场文书
表扬稿格式范文
2015/01/16 职场文书
运动会3000米加油稿
2015/07/21 职场文书
一个成功的互联网创业项目,必须满足这些要求
2019/08/23 职场文书
JS中一些高效的魔法运算符总结
2021/05/06 Javascript
实操Python爬取觅知网素材图片示例
2021/11/27 Python
python中出现invalid syntax报错的几种原因分析
2022/02/12 Python