webpack4.x版本各種常見配置,快來打造屬於你自己的工作流吧(2
更新日誌
2018-12-05
- 提高熱更新速度
- 修改html檔案也觸發熱更新
逼逼兩句
關於webpack是什麼,這裡不多說,,讓我直接進入正題吧!
1.最基礎的配置
新建一個資料夾,就叫webpack吧,先安裝主要依賴
npm install webpack webpack-cli --save-dev
讓我們試試打包一個javascript檔案看看,在src目錄下建立index.js、message.js檔案,在根目錄建立index.html檔案
message.js
export default function (message) {
console.log(message)
}
index.js
import message from './message.js'
message('大家好,我是message函式')
index.html
我的第一個webpack程式
現在當然沒有boundle.js檔案啦,讓我們用webpack將src/index.js打包成boundle.js吧
在根目錄建立webpack入口檔案webpack.config.js
webpack.config.js
module.exports = {
// 入口
entry: './src/index.js',
// 輸出
output: {
filename: 'boundle.js', // 檔名
path: __dirname // 輸出路徑
}
}
怎麼執行呢?如果webpack、webpack-cli安裝到了全域性環境,那麼直接在命令列直接輸入webpack就可以進行打包了,現在我們webpack、webpack-cli是安裝到了專案依賴中,所以得稍微配置一下
package.json
{
"devDependencies": {
"webpack": "^4.20.2",
"webpack-cli": "^3.1.2",
},
"scripts": {
"build": "webpack"
}
}
現在我們執行npm run build就相當於執行webpack命令了
npm run build
現在你可以看到,根目錄下生成了個boundle.js檔案,現在開啟index.html,看控制檯輸出**“大家好,我是message函式”**
2. 打包自動生成html
意思就是,我們執行npm run build之後,可以自動生成index.html、index.js,並且該html裡面自動引入index.js,現在我們可以把根目錄下的index.html刪掉了,以後用不上
安裝依賴,
npm install html-webpack-plugin --save-dev
webpack.config.js
let HtmlWebpackPlugin = require('html-webpack-plugin')
module.exports = {
entry: './src/index.js',
output: {
filename: 'index.js', // 輸出之後的js檔名
path: __dirname + '/dist' // 輸出路徑,一般我們輸出到dist資料夾
},
// 使用外掛
plugins: [
// 生成html
new HtmlWebpackPlugin({
filename: 'index.html',
title: '我是主頁的標題',
}),
]
}
現在執行
npm run build
可以看到在根目錄下生成了dist資料夾
index.html
我是主頁的標題
3. 模板檔案
新建template.html
我是模板檔案
配置
plugins: [
new HtmlWebpackPlugin({
filename: 'index.html',
template: './template.html'
}),
]
4. 使用css
可以使javascript指令碼中引入css檔案,並且寫入到html
npm install style-loader css-loader --save-dev
配置
module.exports = {
module: {
rules: [{
test: /.css$/, // 匹配.css檔案
use: ['style-loader', 'css-loader'] // 使用外掛
}]
},
}
// index.js
import message from './message.js'
import './index.css'
message('大家好,我是message函式')
執行打包,開啟生成的index.html檔案,F12除錯
可以看到自己寫的css檔案被javascript寫入到head中,那如果你想像javascript檔案一樣外聯的形式引入,該怎麼做呢?
5. 分離css
npm install extract-text-webpack-plugin@next --save-dev
配置
let ExtractTextWebpackPlugin = require('extract-text-webpack-plugin')
module.exports = {
module: {
rules: [{
test: /.css$/,
use: ExtractTextWebpackPlugin.extract({
fallback: 'style-loader',
use: 'css-loader'
})
}]
},
plugins: [
new ExtractTextWebpackPlugin('index.css')
]
}
執行打包
index.html
我是主頁的標題
6. 多頁面入口
以上都是單頁面入口,只允許配置一個html檔案以及對應的javascript、css,那麼如何配置多個頁面呢?
配置
let HtmlWebpackPlugin = require('html-webpack-plugin')
module.exports = {
entry: {
index: './src/index.js',
about: './src/about.js'
},
output: {
filename: '[name].js?[hash]', // 生成的名字由entry中的屬性決定,並且加上了版本號
path: __dirname + '/dist'
},
plugins: [
new HtmlWebpackPlugin({
filename: 'index.html',
title: '我是主頁的標題',
chunks: ['index']
}),
new HtmlWebpackPlugin({
filename: 'about.html',
title: '我是關於我們頁面的標題',
chunks: ['about']
}),
]
}
執行打包
7. 多頁面分離css
只需要把css名字動態化即可
index.js
import message from './message.js'
import './index.css'
message('大家好,我是主頁')
about.js
import message from './message.js'
import './about.css'
message('大家好,我是關於我們')
配置
let ExtractTextWebpackPlugin = require('extract-text-webpack-plugin')
module.exports = {
module: {
rules: [{
test: /.css$/,
use: ExtractTextWebpackPlugin.extract({
fallback: 'style-loader',
use: 'css-loader'
})
}]
},
plugins: [
new ExtractTextWebpackPlugin('[name].css'), // css檔名字動態化
]
}
打包後,看dist資料夾目錄
8. css瀏覽器自動補全字首
npm install postcss-loader autoprefixer --save-dev
在根目錄新建postcss.config.js檔案
module.exports = {
plugins: [require('autoprefixer')]
}
配置(css不分離寫法)
module.exports = {
module: {
rules: [{
test: /.css$/,
use: ['style-loader', 'css-loader', 'postcss-loader']
}]
}
}
配置(css分離寫法)
module.exports = {
module: {
rules: [{
test: /.css$/,
use: ExtractTextWebpackPlugin.extract({
fallback: 'style-loader',
use: ['css-loader', 'postcss-loader']
})
}]
}
}
9. babel
babel可以把es最新標準的程式碼轉為es5程式碼,首先需要安裝babel-core、babel-loader(7.1.5版本)、以及轉換版本babel-preset-env
npm install babel-loader@7.1.5 babel-core babel-preset-env --save-dev
配置
module.exports = {
module: {
rules: [{
test: /.js$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
presets: ['env'],
cacheDirectory: true
}
}
}]
}
}
寫一段ES6程式碼測試一下
import message from './message.js'
import './index.css'
let name = '主頁'
message(`大家好,我是${name}`)
執行打包
10. API轉換
babel預設只轉換JavaScript語法,對於新的API,比如Iterator、Generator、Set、Maps、Proxy、Reflect、Symbol、Promise等是不會轉換的。如果需要轉換API,需要使用babel-polyfill
安裝依賴
npm install babel-polyfill --save-dev
在你的javascript檔案頂部引入
import 'babel-polyfill';
let set = new Set([1,2,3]);
11. 圖片資源
webpack處理圖片、字型、音樂、影片等資源時(javascript中require,css的背景圖設定等),需要安裝file-loader
cnpm install file-loader --save-dev
配置
module.exports = {
module: {
rules: [{
test: /.(png|jpe?g|gif|svg)(?S*)?$/,
loader: 'file-loader',
query: {
name: '[name].[ext]?[hash]'
}
}]
}
}
執行打包
12. 清除dist資料夾
每次打包前都能自動清除dist資料夾下的檔案
npm install clean-webpack-plugin --save-dev
配置
let CleanWebpackPlugin = require('clean-webpack-plugin')
module.exports = {
plugins: [
new CleanWebpackPlugin(['dist'])
]
}
13. 分資料夾管理
現在打包之後dist資料夾,太亂了,我們需要在裡面用css、js、images資料夾進行分類管理
配置
let ExtractTextWebpackPlugin = require('extract-text-webpack-plugin')
module.exports = {
output: {
filename: 'js/[name].js', // 在檔名前面加上目錄名稱即可實現
},
module: {
rules: [{
test: /.(png|jpe?g|gif|svg)(?S*)?$/,
loader: 'file-loader',
query: {
name: '[name].[ext]?[hash]',
outputPath: 'images' // 配置圖片生成的目錄
}
}]
},
plugins: [
new ExtractTextWebpackPlugin('css/[name].css') // 配置css檔案生成的目錄
}
執行打包
舒服多了
14. 壓縮分離出來的css檔案
大家應該發現了,javascript檔案自動壓縮了,無需配置,但是分離出來的css檔案沒有自動壓縮
npm install optimize-css-assets-webpack-plugin --save-dev
配置
let OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin')
module.exports = {
plugins: [
new OptimizeCssAssetsPlugin()
]
}
15. 開啟本地伺服器,並且設定熱更新
熱更新是webpack的一個特性,透過無重新整理實現程式碼更新
npm install webpack-dev-server --save-dev
package.json
{
"scripts": {
"dev": "webpack-dev-server"
}
}
配置
let webpack = require('webpack')
module.exports = {
mode: 'development', // 開發模式,熱更新速度提高
plugins: [
new webpack.HotModuleReplacementPlugin() // 啟用HMR
],
devServer: {
contentBase: __dirname + '/dist', // 預設目錄
port: 3000, // 埠
open: true, // 執行時自動在瀏覽器開啟
hot: true // 開啟熱更新
}
}
啟動服務(是不是感覺像極了vue-cli專案)
npm run dev
然後瀏覽器會自動開啟
預設訪問index.html
輸入/about.html訪問關於我們
注意,現在修改javascript,css程式碼才能觸發熱更新(css不分離模式才觸發),html模板檔案則不能
16. 讓修改html模板檔案也觸發熱更新(必須要有模板檔案)
npm install raw-loader --save
新增配置
let webpack = require('webpack')
module.exports = {
module: {
rules: [{
test: /.(htm|html)$/,
use: [
'raw-loader'
]
}]
},
}
在入口檔案匯入模板檔案
import '../index.html'
本文到此結束了,如有錯誤,請大家指出來,至於哪個模組不懂的可以去 / 收藏哦
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1817/viewspace-2814897/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- [應用案例]小程式來了,收錄屬於你的小程式,快來提交吧
- 基於 Gitea+Drone CI+Vault 打造屬於自己的CI/CD工作流Git
- 【遇見offer】微軟專場直播強勢來襲!快來領取你的專屬面試福利吧~微軟面試
- NBU的各種常見埠
- 基於Koa2打造屬於自己的MVC框架MVC框架
- Mac - 打造自己的工作流Mac
- 基於Gitea打造一個屬於你自己的程式碼託管平臺Git
- Step-by-step,打造屬於自己的vue ssrVue
- 讓我們來做一個屬於自己的瀏覽器主頁吧!瀏覽器
- 終於找全了!Go的三種常見的安裝方式,各種系統多個版本應有盡有Go
- 打造屬於自己的underscore系列 ( 一 ) - 框架設計框架
- 基於 vue-cli3 打造屬於自己的 UI 庫VueUI
- 基於react native打造屬於自己的部落格appReact NativeAPP
- 打造屬於你自己的instagram! 全棧專案(react + egg.js)全棧ReactJS
- [小團隊自動化] 基於 Gitea+Drone CI+Vault 打造屬於自己的CI/CD工作流Git
- 從今天開始,拿起VuePress打造屬於自己的專屬部落格Vue
- 用Python打造你的專屬情人節賀卡,趕快發給TA浪漫一下吧Python
- 各式各樣的極品程式設計師 你屬於哪一種程式設計師
- 打造屬於自己的underscore系列(六)- 洗牌演算法演算法
- 《快來為你的 .NET 應用加個監控吧!》更新版本啦
- 2.常見父項屬性
- Ubuntu下Linux配置核心各種常見錯誤和解決辦法UbuntuLinux
- 快來給你的寵物影片加個表情特效吧特效
- Hive學習之常見屬性配置Hive
- 帶你學習透過GitHub Actions如何快速構建和部署你自己的專案,打造一條屬於自己的流水線Github
- 打造屬於你自己的私人大資料顧問(科技|財經|生活購物方面)大資料
- 快來為你的 .NET 應用加個監控吧!
- 建立屬於自己的 Spring Boot 自動配置Spring Boot
- 說說自己對於 MySQL 常見的兩種儲存引擎:MyISAM與 InnoDB的理解MySql儲存引擎
- 打造屬於自己的underscore系列 ( 二 ) - 資料型別診斷資料型別
- 程式設計師生存定律-打造屬於自己的稀缺性程式設計師
- 程式設計師生存定律——打造屬於自己的稀缺性程式設計師
- 程式設計師生存定律:打造屬於自己的稀缺性程式設計師
- 10道Python常見面試題及答案,快來測測你的技術!Python面試題
- [小團隊自動化] 基於Gitea打造一個屬於你自己的程式碼託管平臺Git
- 程式猿的年終總結,各種版本各種殘
- Nginx的各種配置Nginx
- AndroidStudio中各種常見快捷鍵記錄Android