webpack是一個模塊打包工具,可以遞歸構建一個js模塊的依賴關係,將模塊最終打包成一個或多個文件.css
yarn add webpack webpack-cli
複製代碼
webpack能夠進行零配置,只是此時打包功能比較弱.執行:html
npx webpack
複製代碼
進行打包. 執行npx webpack默認查找node_modules---bin文件夾--webpack.cmd--執行../webpack/bin/webpack.jsnode
let path = require('path');
module.exports = {
mode: 'development', //模式:打包後的文件是否可見production/development
entry: './src/index.js', // 入口,能夠是相對路徑
output: { // 出口
filename: 'bundle.[hash:8].js', // 打包後的文件名:+哈希(打包生成新的文件), :8指定哈希長度
path: path.join(__dirname, 'build'), // 打包後的文件路徑:必須是絕對路徑
}
};
複製代碼
webpack-cli文件夾下的config-yarg.js文件指定,配置文件名爲webpack.config.js 或 webpackfile.jsjquery
npx webpack --config webpack.config.name.js
複製代碼
"scripts": {
"build": "webpack --config webpack.config.my.js"
}
// 執行 npm run webpack進行打包
複製代碼
當僅在package.json文件中配置腳本進行打包, 在執行命令中修改配置文件名時:webpack
"scripts": {
"build": "webpack"
}
// 執行npm run build -- --config webpack.config.my.js 打包,注意兩個--進行傳參
複製代碼
webpack-dev-server:啓動了一個使用express的Http服務器es6
// webpack.config.js文件
devServer: { // 開發服務器配置,實現靜態服務
port: 3000, // 服務器啓動端口
progress: true, // 打包進度條
contentBase: path.join(__dirname, './build'), // 指定靜態服務目錄
compress: true, // 是否壓縮
}
// package.json文件
"scripts": {
"build": "webpack",
"dev": "webpack-dev-server"
}
// 執行npm run dev運行靜態服務,經過http://localhost:3000在瀏覽器中訪問
複製代碼
html-webpack-plugin:將打包後的js文件放在html中,將結果放在build目錄下web
// webpack.config.js文件
let HtmlWebpackPlugin = require('html-webpack-plugin');
plugins: [
new HtmlWebpackPlugin({
template: './src/index.html', // html模板文件
filename: 'index.html', // 打包後的文件名稱
hash: true, // 添加哈希,避免緩存
minify: { // 對html也進行壓縮
removeAttributeQuotes: true, // 刪除雙引號
collapseWhitespace: true, // 摺疊爲一行
}
}),
],
複製代碼
在html中不能直接引入css文件,由於上文提到html文件只是一個模板;因此,通常是在js文件中引入css文件,引入時須要經過loader進行解析express
module: {
rules: [{
// css文件
test: /\.css$/,
use: [{
loader: 'style-loader',
options: {
insertAt: 'top', // 將css插入到自定義css的頂部
},
}, 'css-loader'],
}, {
// less文件
test: /\.less$/,
use: [style-loader, 'css-loader', 'less-loader'],
}],
}
複製代碼
將全部的css放在head標籤中,若是內容過多,致使頁面加載阻塞,根據須要將css抽離到單獨的文件中.npm
let MiniCssExtractPlugin = require('mini-css-extract-plugin');
plugins: [
new MiniCssExtractPlugin({
filename: 'main.css', // 抽離出的css文件名
}),
],
module: {
rules: [{
test: /\.css$/,
use: [
MiniCssExtractPlugin.loader, // 使用此loader將抽離後的css文件路徑放在link標籤中
'css-loader',
'postcss-loader',
],
}, {
test: /\.less$/,
use: [
MiniCssExtractPlugin.loader,
'css-loader',
'postcss-loader',
'less-loader'
],
}],
},
複製代碼
// 新增postcss.config.js文件
module.exports = {
plugins: [require('autoprefixer')],
};
// webpack.config.js
use: [
MiniCssExtractPlugin.loader,
'css-loader',
'postcss-loader', // 添加前綴
'less-loader'
],
複製代碼
使用此插件會對css進行壓縮時,必須使用uglifyjs-webpack-plugin,不然js文件不會壓縮json
let OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin');
let UglifyJsPlugin = require('uglifyjs-webpack-plugin');
optimization: { // 優化項
minimizer: [
new UglifyJsPlugin({
cache: true,
parallel: true,
sourceMap: true,
}),
new OptimizeCssAssetsPlugin()
]
}
複製代碼
安裝babel-loader、@babel/core、@babel/preset-env(es6語法)、@babel/plugin-proposal-class-properties@7.5.5(es7語法)、@babel/plugin-proposal-decorators(裝飾器)、@babel/plugin-transform-runtime(修改內置方法或高級語法時使用,抽離部分公共方法)、@babel/runtime(不定)、@babel/polyfill(解析includes方法解析等es7語法) 、eslint(js語句校驗規則)
module: {
rules: [{
test: /\.js$/,
use: {
enforce: 'pre', // 強制將此loader在前執行
loader: 'eslint-loader',
},
exclude: /node_modules/,
}, {
test: /\.js$/,
use: {
loader: 'babel-loader', // 轉化es6語法
options: {
presets: [
'@babel/preset-env',
],
plugins: [ // 轉化es7語法 注意順序
["@babel/plugin-proposal-decorators", { "legacy": true }],
["@babel/plugin-proposal-class-properties", { "loose" : true }],
"@babel/plugin-transform-runtime"
],
},
},
exclude: /node_modules/, // 默認會查找全部文件
include: path.resolve(__dirname, 'src'),
}],
},
複製代碼
eslint校驗規則: 在https://eslint.org/demo中配置須要的eslint校驗規則,而後下載配置好的文件,調價到根目錄下,文件名爲.eslintrc
import $ from 'expose-loader?$!jquery';
console.log(window.$);
或者
module: {
rules: [{
test: require.resolve('jquery'),
use: 'expose-loader?$',
}]
}
複製代碼
let webpack = require('webpack');
plugins: [
new webpack.ProvidePlugin({
$: 'jquery', // 在每一個模塊中注入$
}),
],
複製代碼
<script src="https://code.jquery.com/jquery-3.4.1.min.js"
integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo="
crossorigin="anonymous"></script> // 直接引入不打包
複製代碼
此時,經過import $ from 'jquery'時,須要配置externals避免jquery被從新打包.
externals: {
jquery: '$',
}
複製代碼
file-loader: 生成一張圖片到build目錄下並返回新的圖片地址
import img from './640.jpeg'; // 引入圖片,返回的結果是一個新的圖片地址
let image = new Image();
image.src = img;
document.body.appendChild(image);
// webpack.config.js
module: {
module: {
rules: [{
test: /\.(png|jpg|jpeg|gif)$/,
use: {
loader: 'file-loader',
},
}]
}
複製代碼
background: url('./huaer.jpeg');
複製代碼
能夠直接引入,css-loader會對其轉爲require方式引入
在html文件中直接引入圖片時,經過html-withimg-loader對圖片文件進行處理
<img src='./huaer.jpeg' />
// webpack.config.js
module: {
rules: [{
test: /\.html$/,
use: 'html-withimg-loader',
}]
}
複製代碼
經過url-loader能夠將圖片轉爲base64,減小http請求次數.缺點是文件變大
module: {
rules: [{
test: /\.(png|jpg|jpeg|gif)$/,
use: {
loader: 'url-loader',
options: {
limit: 1, // 當圖片小於n k時 用base64轉換
outputPath: '/img/', // 輸出路徑,實現對靜態文件分類
publicPath: 'http://guazi.com', // 當經過cdn方式引入文件時,配置引入路徑
}
},
}]
}
複製代碼