ES6之ES Module

181 阅读2分钟

前言

历史上,JavaScript 一直没有模块(module)体系,无法将一个大程序拆分成互相依赖的小文件,再用简单的方法拼装起来。在 ES6 之前,社区制定了一些模块加载方案,最主要的有 CommonJS 和 AMD 两种。前者用于服务器,后者用于浏览器。ES6 在语言标准的层面上,实现了模块功能,而且实现得相当简单,完全可以取代 CommonJS 和 AMD 规范,成为浏览器和服务器通用的模块解决方案。

ES Module的特性

通过给script标签加 type="module" 就可以直接使用ES Module 的标准执行其中的 JS 代码。

在不支持ES Module的浏览器中执行某个js,可以通过给script加上 nomodule ,这样不支持的浏览器就会运行这个js,而支持的浏览器则不会运行这个js

  • 会自动采用严格模式,this是 undefined
  • 每个js有自己的独立作用域
<script type="module">
  var foo = 100
  console.log(foo)
</script>
<script type="module">
  console.log(foo) // foo is not defined
</script>
  • 会延迟执行js脚本,不会影响到html界面固定的静态标签的展示
  • script标签引入的js都会产生跨域。如果是其他网站的js,则需要引入支持跨域的,如果是自己本地的js,则开启一个本地服务器。提供一个参考
//全局安装browser-sync
npm install browser-sync -g
// 打开文件夹目录,执行命令
browser-sync . --files **/*.js

ES Module的导入与导出

  • 通过export和export default导出一个模块
  • 通过import引入一个模块,有以下几点需要注意
    • import导入时不是解构导出对象
    • 文件的后缀.js必须加上
    • 可以通过 * as obj 获取到所有的导出,放到obj对象中
    • 当同时使用了export和export default时,import可以用逗号分隔出默认导出对象和export导出对象
// a.js 导出的时候,可以同时使用export和export default
const name = 'sky'
const age = 18
const sex = '男'

export {
  name,
  age,
  sex
}

export default [
  1,2,3
]

// b.js
export default function () {
  console.log('我是b.js')
}

// index.js

// import arr, * as obj from './a.js'
/*
arr 是export default导出的,必须放在最前面
* as obj 和 {name} 是export导出的
*/
import arr, {name} from './a.js'
import fn from './b.js'
console.log(arr, name)
fn()

ES Module运行在node环境下

  • ES Module可以导入commonJS模块
  • commonJS不可以导入ES Module模块
  • commonJS始终只会导出一个默认成员