// import 做爲一個方法使用,傳入模塊名便可,返回一個 promise 來獲取模塊暴露的對象 // 註釋 webpackChunkName: "lodash" 能夠用於指定 chunk 的名稱,在輸出文件時有用 // import 後面的註釋 webpackChunkName: "lodash" 用於告知 webpack 所要動態加載模塊的名稱 import(/* webpackChunkName: "lodash" */ 'lodash').then((_) => { console.log(_.lash([1, 2, 3])) // 打印 3 } // 須要在配置下輸出代碼塊的文件名 output: { path: path.resolve(__dirname, 'dist'), filename: '[name].[hash:8].js', chunkFilename: '[name].[hash:8].js' // 指定分離出來的代碼文件的名稱 }
``` // src/math.js export function square(x) { return x * x; } export function cube(x) { return x * x * x; } // src/index.js import { cube } from './math.js' // 在這裏只是引用了 cube 這個方法 console.log(cube(3)) ```
若是整個項目代碼只是上述兩個文件,那麼很明顯,square 這個方法是未被引用的代碼,是能夠刪掉的。在 webpack 中,只有啓動了 JS 代碼壓縮功能(即便用 uglify)時,會作 Tree shaking 的優化。webpack 4.x 須要指定 mode 爲 production,而 webpack 3.x 的話須要配置 UglifyJsPlugin。啓動了以後,構建出來的結果就會移除 square 的那一部分代碼了。webpack
若是你在項目中使用了 Babel 的話,要把 Babel 解析模塊語法的功能關掉,在 .babelrc 配置中增長 "modules": false 這個配置:web
{ "presets": [["env", { "modules": false }]] }
import { forEach, includes } from 'lodash-es' forEach([1, 2], (item) => { console.log(item) }) console.log(includes([1, 2, 3], 1)) //最終 webpack 不會把 lodash-es 全部的代碼內容打包進來,只是打包了你用到的那兩個方法,這即是 sideEffects 的做用。