--- title: 'ES Module' --- ## ES Module --- 隨著 Web 應用程式的複雜性提高 JavaScript 模組化開發已經成為必然的趨勢 --- 先追溯過往的幾種 JS 引用方式 --- ### CDN-Based 最傳統的 ```<script>``` 引入方式 全域作用域容易造成變數污染和衝突<!-- .element: class="fragment" --> 文件只能依照 ```<script>``` 順序載入,不具彈性<!-- .element: class="fragment" --> 在大型專案中各種資源和版本難以維護<!-- .element: class="fragment" --> 必須由開發者自行判斷模組和函式庫之間的依賴關係<!-- .element: class="fragment" --> --- ### AMD 非同步載入模組的規範 基本格式: ```javascript= define(id?, dependencies?, factory); ``` ```javascript= require(['esri/map'], function(Map) { var map = new Map('map', { center: [-118, 34.5], zoom: 8, basemap: "topo" }); }); ``` --- ### CommonJS ```javascript= const http = require('http'); ``` ```javascript= const { src, dest, parallel } = require('gulp'); ``` CommonJS 導出模組範例 ```javascript= module.exports = (a, b) => { console.log(a + b); }; ``` --- ECMAScript 6 的標準中定義了 JavaScript 的模組化方式 讓 JavaScript 在開發大型複雜應用程式時上更為方便且易於管理 亦可以取代過去 AMD、CommonJS 等規範<!-- .element: class="fragment" data-fragment-index="1" --> 成為通用於瀏覽器端和伺服器端的模組化解決方案<!-- .element: class="fragment" data-fragment-index="1" --> --- ### ES Module ```javascript= // add.js const add = (a, b) => a + b; export default add; ``` ```javascript= // index.js import add from "./add"; console.log(add(5, 8)); // 13 ``` ```javascript= // add.js export const add = (a, b) => a + b; ``` ```javascript= // index.js import { add } from "./add"; console.log(add(5, 8)); // 13 ``` --- 但目前瀏覽器和 Node 在 ES6 模組支援度還不完整 大部分情況需要透過 Babel 轉譯器進行轉譯 或是用 webpack 來打包 --- 小小的理解 ES Module 後 就能來講 webpack 了 --- ###### tags: `前端` 下一章: [webpack](https://hackmd.io/p/SJIOgEg64#/)