NodeJS模块和ES6模块系统语法及注意点
社区模块规范:
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模块系统语法及注意点的更多相关文章
- commonjs模块和es6模块的区别
commonjs模块与es6模块的区别 到目前为止,已经实习了3个月的时间了.最近在面试,在面试题里面有题目涉及到模块循环加载的知识.趁着这个机会,将commonjs模块与es6模块之间一些重要的的区 ...
- commonjs模块和es6模块的区别?
commonjs模块和es6模块最主要的区别:commonjs模块是拷贝,es6模块是引用,但理解这些,先得理解对象复制的问题,在回过头来理解这两模块的区别. 一.基本数据类型的模块 ./a1.js ...
- Es6模块语法笔记
/** * Created by Administrator on 2017/4/15. */ /*---------------------export命令--------------------- ...
- es6 模块和commonjs规范模块的区别
相关代码地址:https://github.com/blank-x/blog-code/tree/main/1-module 引入变量 es6 导入变量只是一个符号链接,是个常量,类似于const 声 ...
- JS模块之AMD, CMD, CommonJS、UMD和ES6模块
CommonJS 传送门 同步加载,适合服务器开发,node实现了commonJS.module.exports和require 判断commonJS环境的方式是(参考jquery源码): if ( ...
- 深入ES6 模块系统
深入ES6 模块系统 本文转载自:众成翻译 译者:neck 链接:http://www.zcfy.cc/article/4436 原文:https://ponyfoo.com/articles/es6 ...
- es6模块 nodejs模块和 typescript模块
es6模块 import和export nodejs模块 require和module.exports typescript模块 module和export
- ES6模块的import和export用法总结
ES6之前以前出现了js模块加载的方案,最主要的是CommonJS和AMD规范.commonjs前者主要应用于服务器,实现同步加载,如nodejs.AMD规范应用于浏览器,如requirejs,为异步 ...
- ES6模块的import和export用法
ES6之前已经出现了js模块加载的方案,最主要的是CommonJS和AMD规范.commonjs主要应用于服务器,实现同步加载,如nodejs.AMD规范应用于浏览器,如requirejs,为异步加载 ...
随机推荐
- Java8 新特性 Stream 无状态中间操作
无状态中间操作 Java8 新特性 Stream 练习实例 中间无状态操作,可以在单个对单个的数据进行处理.比如:filter(过滤)一个元素的时候,也可以判断,比如map(映射)... 过滤 fil ...
- PHP中直接使用sql语句
SELECT * FROM `tf_user` WHERE (`company_id` = '117' OR `other_company_ids` LIKE '%117,%' OR `other_c ...
- Scala Types 2
存在类型 形式: forSome { type ... } 或 forSome { val ... } 主要为了兼容 Java 的通配符 示例 Array[_] // 等价于 Array[T] for ...
- Prometheus 安装Grafana与Prometheus集成
Prometheus 安装Grafana与Prometheus集成 Grafana是一个开源的度量分析和可视化系统. 下载地址:https://grafana.com/grafana/download ...
- python爬虫—爬取英文名以及正则表达式的介绍
python爬虫—爬取英文名以及正则表达式的介绍 爬取英文名: 一. 爬虫模块详细设计 (1)整体思路 对于本次爬取英文名数据的爬虫实现,我的思路是先将A-Z所有英文名的连接爬取出来,保存在一个cs ...
- MVC+Ninject+三层架构+代码生成 -- 总结(七、顯示層 一)
1.顯示層 在網上找的 Bootstrap 模板.
- Spring.yml配置文件读取字符串出现错误
今天遇到一个诡异的问题,在配置文件中配置了一个值为字符串的属性,但是在用@Value注入时发现注入的值不是我配置的值,而且在全文都没有找到匹配的值 之后研究了好久,发现yml文件会把0开头的数组进行8 ...
- spring容器的功能扩展
容器的扩展功能主要实现为: org.springframework.context.support.AbstractApplicationContext.refresh() public void r ...
- response.Close、response.End、response.Flush区别(下载文件)
今天在做文件下载功能用到的是response的方法,首先我们要了解这些方法的作用. 1.response.write():将信息写入http响应输出流. 2.response.Flush:向客户端发送 ...
- js 字符串换行 显示 使用 \ 转义
js 字符串 有没有 像C# @ 那种 换行也可以显示的方法\