配置 webpack
在項目中安裝和配置 webpack
- npm install webpack webpack-cli -D
- 在根目錄中,建立名為 webpack.config.js 的webpack配置檔案
- 在 webpack.config.js 檔案中配置如下:
module.exports = {
mode: 'development' // mode 用來指定構模組化式
}
- 在 package.json 檔案中的 scripts 節點下,新增 dev 腳本如下:
"scripts": {
"dev": "webpack" // script 節點下的腳本,可以通過 npm run 執行
}
- 在終端中運作 npm run dev 指令, 啟動 webpack 進行項目打包
配置打包的入口與出口
webpack 的 4.x 版本中預設約定:
- 打包的入口檔案為 src -> index.js
- 打包的輸出檔案為 dist -> main.js
如果要修改打包的入口與出口,可以在 webpack.config.js 中新增如下配置資訊:
const path = require('path'); // 導入 node.js 中專門操作路徑的子產品
module.exports = {
entry: path.join(__dirname, './src/index.js'), // 打包入口檔案的路徑
output: {
path: path.join(__dirname, './dist'), // 輸出檔案的存放路徑
filename: 'bundle.js' // 輸出檔案的名稱
}
}
webpack 自動打包功能
- npm install webpack-dev-server -D
- 修改 package.json -> scripts 中的 dev
"scripts": {
"dev": "webpack-dev-server"
}
- 将 src -> index.html 中的 script 腳本路徑,改為絕對路徑 “/buldle.js”
- 運作 npm run dev 指令,重新打包
- 在浏覽器中通路 http://localhost:8080 可以檢視自動打包後的效果
注意:
webpack-dev-server 會啟動一個實時打包的 http 伺服器
webpack-dev-server 打包生成的輸出檔案,預設放到了項目根目錄中,而且是虛拟的,看不見
配置 html-webpack-plugin 生成預覽頁面
- npm install html-webpack-plugin -D
- 修改 webpack.config.js 檔案頭部區域,添加如下配置資訊:
// 導入生成預覽頁面的插件,得到一個構造函數
const HtmlWebpackPlugin = require('html-webpack-plugin');
const htmlPlugin = new HtmlWebpackPlugin({ // 建立插件的執行個體對象
template: './src/index.html', // 指定要用到的模闆檔案
filename: 'index.html' // 指定生成檔案的名稱,該檔案存在于記憶體中,在目錄中不顯示
});
- 修改 webpack.config.js 檔案中向外暴露的配置對象, 新增如下配置節點:
module.exports = {
plugins: [ htmlPlugin ] // plugins 數組是 webpack 打包期間會用到的一些插件清單
};
配置自動打包相關的參數
// package.json 中的配置
// --open 打包完成後自動打開浏覽器頁面
// --host 配置 IP 位址
// --port 配置端口
"scripts": {
"dev": "webpack-dev-server --open --host 127.0.0.1 --port 8888"
},
webpack 中的加載器
通過 loader 打包非 js 子產品
在實際開發過程中,webpack 預設隻能打包處理以 .js 字尾名結尾的子產品,其他非 .js 字尾名結尾的子產品,webpack 預設處理不了, 需要調用 loader 加載器才可以正常打包,否則會報錯!
loader 加載器可以協助 webpack 打包處理特定的檔案子產品,比如:
- less-loader 可以打包處理 .less 相關的檔案
- sass-loader 可以打包處理 .scss 相關的檔案
- url-loader 可以打包處理 css 中與 url 路徑相關的檔案
loader 的調用過程:
打包處理 css 檔案
- npm i style-loader css-loader -D
- 在 webpack.config.js 的module.exports中添加 module -> rules 數組中,添加 loader 規則如下:
// 所有第三方檔案子產品的比對規則
module: {
rules: [
{ test: /\.css$/, use: ['style-loader', 'css-loader'] }
]
}
其中,test 表示比對的檔案類型, use 表示對應要調用的 loader
注意:
- use 數組中指定的 loader 順序是固定的
- 多個 loader 的調用順序是:從後往前調用
打包處理 less 檔案
- npm i less-loader less -D
- 在 webpack.config.js 中向外暴露的部分中添加如下 loader 規則:
// 所有第三方檔案子產品的比對規則
module: {
rules: [
{ test: /\.less$/, use: ['style-loader', 'css-loader', 'less-loader'] }
]
}
打包處理 scss 檔案
- npm i sass-loader node-sass -D
- 在 webpack.config.js 中向外暴露的部分中添加如下 loader 規則:
module: {
rules: [
{ test: /\.scss$/, use: ['style-loader', 'css-loader', 'sass-loader'] }
]
}
配置 postCSS 自動添加 css 的相容字首
- npm i postcss-loader autoprefixer -D
- 在項目根目錄中建立 postcss 的配置檔案 postcss.config.js,并初始化如下配置:
const autoprefixer = require('autoprefixer'); // 導入自動添加字首的插件
module.exports = {
plugins: [ autoprefixer ] // 挂載插件
}
- 在 webpack.config.js 的module -> rules 數組中,修改 css 的 loader 規則如下:
module: {
rules: [
{ test: /\.css$/, use: ['style-loader', 'css-loader', 'postcss-loader'] }
]
}
打包樣式表中的圖檔和字型檔案
- npm i url-loader file-loader -D
- 在 webpack.config.js 中向外暴露的部分中添加如下 loader 規則:
module: {
rules: [
{
test: /\.jpg|png|gif|bmp|ttf|eot|svg|woff|woff2$/,
use: 'url-loader?limit=16940'
}
]
}
其中 ? 之後的是 loader 的參數項
limit 用來指定圖檔的大小,機關時直接(byte),隻有小于 limit 大小的圖檔,才會被轉化為 base64 圖檔
打包處理 js 檔案中的進階文法
- 安裝babel轉換器相關的包:npm i babel-loader @babel/core @babel/runtime -D
- 安裝babel文法插件相關的包:npm i @babel/preset-env @babel/plugin-transform-runtime @babel/plugin-proposal-class-properties -D
- 在項目根目錄中,建立 babel 配置檔案 babel.config.js 并初始化基本配置如下:
module.exports = {
presets: [ '@babel/preset-env' ],
plugins: [ '@bable/plugin-transform-runtime', '@babel/plugin-proposal-class-properties' ]
}
- 在 webpack.config.js 的 module -> rules 數組中,添加 loader 規則如下:
// exclude 為排除項,表示 babel-loader 不需要處理 node_modules 中的 js 檔案
{ test: /\.js$/, use: 'babel-loader', exclude: /node_modules/ }
webpack 中配置 vue 元件加載器
- npm i vue-loader vue-template-compiler -D
- 在 webpack.config.js 配置檔案中,添加 vue-loader 的配置項如下:
const VueLoaderPlugin = require('vue-loader/lib/plugin')
module.exports = {
module: {
rules: [
// ... 其它規則
{ test: /\.vue$/, loader: 'vue-loader' }
]
},
plugins: [
// ... 其它插件
new VueLoaderPlugin() // 請確定引入這個插件!
]
}
webpack 打包釋出
上線之前需要通過webpack将應用進行整體打包,可以通過 package.json 檔案配置打包指令:
// 在package.json檔案中配置 webpack 打包指令
// 該指令預設附加元件目根目錄中的webpack.config.js 配置檔案
"scripts": {
// 用于打包的指令
"build": "webpack -p",
// 用于開發調試的指令
"dev": "webpack-dev-server --open --host 127.0.0.1 --port 3000"
},