---
title: webpack
robots: noindex, nofollow
lang: zh-tw
dir: ltr
breaks: true
tags: webpack
disqus: hackmd
---
# Webpack
## 安裝套件包
- 確認 node 版本 → `node -v`
- 確認 npm 版本 → `npm -v`
- 安裝 npm → `npm install` / `npm i`
- 用 npm 安裝套件 → `npm i PACKAGE` (`npm i webpack`)
- 指定套件版本 → `npm i PACKAGE@x.x.x` (`npm install webpack@5.4.0`)
- 安裝至 devDependencies → `npm i PACKAGE -D`
- 確認 yarn 版本 → `yarn -v`
- 安裝 yarn → `yarn install`
- 用 yarn 安裝套件 → `yarn install PACKAGE`
> - 當專案沒有 `node_modeuls/` 資料夾時需要先安裝 npm
> - 所有的 package 都是小寫
---
## webpack.config.js
### `devtool`
- `sourcemap` → 打包的方式,官方有提供七種打包方式,開發時通常使用 `inline-source-map` 即可,上 prodcution 會拿掉
```javascript
// production 發佈就拿掉 source-map
devtool: DEV_MODE ? 'inline-source-map' : false,
```
### `output`
webpack 會將專案中的所有 JS 打包成一個檔案
- `filename` → 打包後的檔名
- `path` → 打包後的檔案要存放的路徑
### `context`
- `path.resolve('src')` → 指定所有的檔案都從 src 資料夾開始
### `entry`
程式進入點
```javascript
// 完整地寫完
entry: './src/index.js'
// 有先指定進入的資料夾位置,因為有加 context, 所以就不需要寫 src
context: path.resolve('src'),
entry: {
'app': './app.js'
},
```
---
## package.json
### `scripts`
- `start` → 前端的不成文規定,在開發時皆使用這個指令
- `webpack --mode development` → 以開發者模式啟動 webpack 打包
```bash
# 使用 npm 啟動使令
$ npm run start
# 使用 yarn 啟動指令
$ yarn run start
```
- `start:watch` → 觀察 `src/` 裡的檔案,如果有異動則即時重新打包一次
- `webpack --watch --mode development`
```bash
# 使用 npm 啟動使令
$ npm run start:watch
# 使用 yarn 啟動指令
$ yarn run start:watch
# Ctrl+C 退出
```
- `build` → 前端的不成文規定,上 production 時皆使用這個指令
- `webpack --mode production` → 以 production 模式啟動 webpack 打包
```bash
# 使用 npm 啟動使令
$ npm run build
# 使用 yarn 啟動指令
$ yarn run build
```
---
## 環境變數
使用套件 `cross-env` 以及環境變數 `NODE_ENV` 取代 `--mode development/production`
- `NODE_ENV` → webpack 裡面預設需要支援的環境變數,僅支援 `development` 和 `production` 這兩個關鍵字
```json
// package.json
"scripts": {
"start": "cross-env NODE_ENV=development webpack",
"build": "cross-env NODE_ENV=production webpack"
}
```
- `process.env.NODE_ENV` → 可讀取到目前的環境
---
# 模組化概念
## ES6 Module
### 輸出
#### `export`
將 function 輸出,讓別的檔案也能使用,類似 OOP 裡 public 概念,非原生 JS 語法
```javascript
export function add(a, b) {
return a + b;
}
```
#### `export default`
一個 JS 檔 (一個 module) 裡只能有一個 `export default`,`export default` 優先使用,不夠才使用一般的 `export` (沒有數量限制)
```javascript
class MyClass {
foo(){
console.log('foo');
}
}
export default MyClass;
```
### 引入
#### `import`
- 一般的 `export` 引入需要加上花括號 `{ function 名稱 }`
- `export default` 引入直接寫上 function 名稱
```javascript
// export
import { add, subtract } from "./utils/esm";
// export default
import MyClass from './utils/esm';
// 合併上面兩行
import MyClass, { add, subtract } from "./utils/esm";
```
#### `from`
指的是 `webpack.config.js` 中 `entry` (程式進入點位置)的相對路徑
原本應該包含檔名、副檔名都要完整寫出來,但 webpack 預設會認定 .js 副檔名所以可省略,而若要 import 的檔名剛好為 index 也可以一併省略
```javascript
// 完整的寫法
import { add, subtract } from "./utils/esm/index.js";
// 省略副檔名
import { add, subtract } from "./utils/esm/index";
// 省略 index 檔名
import { add, subtract } from "./utils/esm";
```
## CommonJS
### 輸出
只能 `module.export` (一個個輸出),沒有 `export default`
```javascript
function multiply(a, b) {
return a * b;
}
function divide(a, b) {
return a / b;
}
module.exports = {
multiply: multiply,
divide: divide,
};
```
### 引入
```javascript
const utils = require('./utils/commonjs');
utils.multiply(2, 2));
utils.divide(2, 2);
```
---