Wang's blog Wang's blog
首页
  • 前端文章

    • HTML教程
    • CSS
    • JavaScript
  • 前端框架

    • Vue
    • React
    • VuePress
    • Electron
  • 后端技术

    • Npm
    • Node
    • TypeScript
  • 编程规范

    • 规范
  • 我的笔记
  • Git
  • GitHub
  • VSCode
  • Mac工具
  • 数据库
  • Google
  • 服务器
  • Python爬虫
  • 前端教程
更多
收藏
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Wang Mings

跟随大神,成为大神!
首页
  • 前端文章

    • HTML教程
    • CSS
    • JavaScript
  • 前端框架

    • Vue
    • React
    • VuePress
    • Electron
  • 后端技术

    • Npm
    • Node
    • TypeScript
  • 编程规范

    • 规范
  • 我的笔记
  • Git
  • GitHub
  • VSCode
  • Mac工具
  • 数据库
  • Google
  • 服务器
  • Python爬虫
  • 前端教程
更多
收藏
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • Python爬虫

  • 前端教程

    • 团队规范

    • Project

    • JS

      • Canvas基础
      • 数据结构
      • 树的深度优先遍历与广度优先遍历
      • for in和for of区别
      • ES6-新增特性一览
      • ES6-解构赋值及原理
      • ES6-Object
      • ES6-模块详解
        • [#](#编译时静态检查) 编译时静态检查
          • [#](#es6-module和commonjs不同) es6 module和commonjs不同
        • [#](#export-几种用法) export 几种用法
        • [#](#import-几种用法) import 几种用法
        • [#](#参考文章) 参考文章
      • ES6-Class
      • ES6-ECMAScript特性汇总
      • 输入URL背后的技术步骤
      • JavaScript与浏览器 - 线程与引擎
      • HTTP跨域解决方案
      • Http 2与Http 1.x比较
      • JavaScript原型
      • JavaScript继承
      • JavaScript事件循环
      • 动手实现Promise
      • JS设计模式
      • JS 经典面试题
      • 排序算法
      • 正则表达式
      • MVC、MVP、MVVM区别
      • Array API与V8源码解析
      • 从V8 sort源码看插入排序
    • NodeJS

    • Vue

    • React

    • 效率工具

    • 读书笔记

  • 教程
  • 前端教程
  • JS
wangmings
2022-07-19
目录

ES6-模块详解

# # ES6-模块详解

# # 编译时静态检查

在 ES6 之前,社区制定了一些模块加载方案,最主要的有 CommonJS 和 AMD 两种。前者用于服务器,后者用于浏览器。ES6 在语言标准的层面上,实现了模块功能,完全可以取代 CommonJS 和 AMD 规范,成为浏览器和服务器通用的模块解决方案。

ES6 模块的设计思想是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量。CommonJS 和 AMD 模块,都只能在运行时确定这些东西。

    // 错误:由于不是编译时检查,所以这种方式会报错,而commonjs就不会
    // 所以使用import和export都会放在最外层,而允许放在arr.forEach(key => import * from key)中
    let modulePath = './test'
    import test from modulePath
    
    // 正确
    import test from './test'
    
1
2
3
4
5
6
7
8

# # es6 module和commonjs不同

  1. es6 module编译时输出接口,commonjs运行时加载。
  2. es6 module输出引用,commonjs输出拷贝。
  3. 循环引用处理不同。es6 module生成指向,内容自己保证;commonjs只输出已执行部分(说到底还是输出拷贝)。

由于动态加载非常实用,故tc39引入了import() (opens new window) (opens new window)提案,帮动态加载模块

# # export 几种用法

export命令用于规定模块的对外接口

    // 使用export {}不能使用import {name1, name2, …} from '...'方式导入
    export { name1, name2, …, nameN };
    export { variable1 as name1, variable2 as name2, …, nameN };
    
    // export type方式
    // 使用export type才是import {name1, name2, …} from '...'的正确使用方式
    export let name1, name2, …, nameN;
    export let name1 = …, name2 = …, …, nameN;
    export function FunctionName() {...}
    export class ClassName {...}
    
    // export default 方式。 default、 as 关键字
    export default expression;
    export default function (…) { … }
    export default function name1(…) { … }
    export { name1 as default, … }; // 等价于export default name1, ...
    
    // 模块继承,导入和导出在一行。
    // 这种方式非常适合重构时,帮助把大文件拆分成多个小文件
    export * from …;
    export { name1, name2, …, nameN } from …;
    export { import1 as name1, import2 as name2, …, nameN } from …;
    
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

# # import 几种用法

使用export命令定义了模块的对外接口以后,其他 JS 文件就可以通过import命令加载这个模块。

    // export default 方式
    import defaultName from 'modules.js';
    
    // export type 方式
    import { export1, export2 } from 'modules';
    import { export1 as ex1, export2 as ex2 } from 'moduls.js'; // as 关键字
    import * as moduleName from 'modules.js';
    
    // 同时引入export default 和export type
    import defaultName, { expoprt1, export2 } from 'modules';
    import defaultName, * as moduleName from 'modules';
    
    // 引入无输出模块
    import 'modules';
    
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# # 参考文章

  • 阮一峰-ESMAScript6入门 (opens new window) (opens new window)
  • ES6 export * from import (opens new window) (opens new window)
  • javascript中import和export用法总结 (opens new window) (opens new window)
编辑 (opens new window)
ES6-Object
ES6-Class

← ES6-Object ES6-Class→

最近更新
01
theme-vdoing-blog博客静态编译问题
09-16
02
搜索引擎
07-19
03
友情链接
07-19
更多文章>
Theme by Vdoing | Copyright © 2019-2022 Evan Xu | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式