社区模块规范:

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 与 import复合写法

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模块和ES6模块系统语法及注意点的更多相关文章

  1. commonjs模块和es6模块的区别

    commonjs模块与es6模块的区别 到目前为止,已经实习了3个月的时间了.最近在面试,在面试题里面有题目涉及到模块循环加载的知识.趁着这个机会,将commonjs模块与es6模块之间一些重要的的区 ...

  2. commonjs模块和es6模块的区别?

    commonjs模块和es6模块最主要的区别:commonjs模块是拷贝,es6模块是引用,但理解这些,先得理解对象复制的问题,在回过头来理解这两模块的区别. 一.基本数据类型的模块 ./a1.js ...

  3. Es6模块语法笔记

    /** * Created by Administrator on 2017/4/15. */ /*---------------------export命令--------------------- ...

  4. es6 模块和commonjs规范模块的区别

    相关代码地址:https://github.com/blank-x/blog-code/tree/main/1-module 引入变量 es6 导入变量只是一个符号链接,是个常量,类似于const 声 ...

  5. JS模块之AMD, CMD, CommonJS、UMD和ES6模块

    CommonJS 传送门 同步加载,适合服务器开发,node实现了commonJS.module.exports和require 判断commonJS环境的方式是(参考jquery源码): if ( ...

  6. 深入ES6 模块系统

    深入ES6 模块系统 本文转载自:众成翻译 译者:neck 链接:http://www.zcfy.cc/article/4436 原文:https://ponyfoo.com/articles/es6 ...

  7. es6模块 nodejs模块和 typescript模块

    es6模块 import和export nodejs模块 require和module.exports typescript模块 module和export

  8. ES6模块的import和export用法总结

    ES6之前以前出现了js模块加载的方案,最主要的是CommonJS和AMD规范.commonjs前者主要应用于服务器,实现同步加载,如nodejs.AMD规范应用于浏览器,如requirejs,为异步 ...

  9. ES6模块的import和export用法

    ES6之前已经出现了js模块加载的方案,最主要的是CommonJS和AMD规范.commonjs主要应用于服务器,实现同步加载,如nodejs.AMD规范应用于浏览器,如requirejs,为异步加载 ...

随机推荐

  1. PG数据库获取最近四个小时 使用产品的用户审计信息

    1. 使用关联子查询 2. 使用时间interval SELECT 审计表.COUNT, gspuser.code FROM gspuser JOIN ( SELECT gspaudit1912.us ...

  2. 深入浅出 REST(转)

    文章讲的不错,更具体一些,对实践的指导意义更强 原文:https://www.infoq.cn/article/rest-introduction/ 不知你是否意识到,围绕着什么才是实现异构的应用到应 ...

  3. printf()的用法

    a 符号 作用 ——————————————————————————   %d 十进制有符号整数   %u 十进制无符号整数   %f 浮点数   %s 字符串   %c 单个字符   %p 指针的值 ...

  4. secure-file-priv特性

    转载自:https://segmentfault.com/a/1190000009333563 当出现:1290 - The MySQL server is running with the --se ...

  5. 【04】Saltstack:配置管理

    写在前面的话 当我们需要进行一系列可重复且复杂的操作的时候,如果还继续用传统的 cmd.run 来执行显然难以满足我们的需求.这时候就会在想一个问题,我们能不能把这些操作编辑成一个类似脚本的操作,我们 ...

  6. .NET获取实例化对象的部分属性名称

    前言 项目中实例化的对象,对象中里面很有很多属性,有些是我们不需要的,有些是我们需要的,例如在下面的示例中:ID,CreateBy等属性在CB_Projects对象中是不需要的,在获取实例化对象属性名 ...

  7. mac下搭建Apache服务器环境

    mac下自带了一个Apache服务环境,所以不需要另外去下载,直接配置就好了. 一.启动Apache服务 在终端下输入 sudo apachectl start , 启动Apache服务.在浏览器输入 ...

  8. linux 搭建swoole

    1安装依赖包yum -y install gcc gcc-c++ autoconf automake yum -y install zlib zlib-devel openssl openssl-de ...

  9. ES6 对象的拓展(三)

    一.对象中的属性及方法1.属性属性简写:当对象属性名与属性值变量相同可以简写eg: let [name,age]=['nzc','18']; let obj = { name:name, age:ag ...

  10. 记录vue项目 用hbuilder离线打包集成极光推送 安卓篇

    极光推送的官方demo: https://github.com/jpush/jpush-hbuilder-demo 里面也记录有详细的方法了. 我记录下自己的过程. 首先去极光那里创建一个应用 获取A ...