webpack是一個模塊打包器,能夠根據入口文件,隨着依賴關係將全部文件打包成js文件。css
首先須要node環境,百度一下本身安裝html
webpack官網地址:https://www.webpackjs.comvue
首先,創建一個文件,叫webpack1(不能叫webpack,不然初始化報錯)node
初始化:jquery
npm init -y
初始化以後,文件夾中會出現一個package.json文件webpack
以後安裝webpackes6
npm i -D webpack
webpack4還須要安裝一個webpack-cliweb
npm i -D webpack-cli
以後在根目錄下建立一個src文件夾,裏面放的是源碼,裏面放一個index.js,是入口文件;npm
在根目錄建一個dist文件,用來盛放打包後的文件,dist文件夾中再放一個index.html文件;json
再在跟目錄下建立一個webpack.config.js文件,當作webpack的配置文件
在src/index.js中隨便寫點代碼:
import _ from 'lodash'; import "./style/index.css";//loader=>css-loader module style-loader import "./style/a.scss"; function createDomElement(){ let dom = document.createElement('div'); dom.innerHTML=_.join(["aicoder.com","好!","線下實習"],""); // dom.className="box"; dom.classList.add("box"); return dom; } let divDom = createDomElement(); document.body.appendChild(divDom);
在webpack.config.js中做出簡單配置:
const path = require("path"); module.exports={ entry:"./src/index.js",//入口文件 mode:"development",//模式是開發環境 output:{//出口文件時main.js,打包到當前目錄的dist文件夾下 filename:"main.js", path:path.resolve(__dirname,"dist") }, module: { rules: [ { //告訴webpack,當import,require遇到.css文件時,用css-loader、style-loader處理一下 test: /\.(sc|c|sa)ss$/,//scss,css,sass use: ["style-loader","css-loader","sass-loader"],//loader的使用數據是從右向左的 } ] } }
在dist/index.html中引入打包生成的main.js
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<script src="./main.js"></script>
</body>
</html>
固然咱們還在src/style/中加了index.css和a.sass文件,
若是想讓webpack打包js以外的文件,須要安裝對應的loader
css須要css-loader(用來解析css文件)、style-loader(用來將打包好的css文件用style標籤引入)
scss文件須要 sass-loader 和 node-sass
一口氣安裝了:
npm i -D css-loader style-loader sass-loader node-sass
以後執行npx webpack
dist文件中就會出現打包好的main.js
而後就能夠打開dist/index.html看一下效果。
若是咱們想執行本身的自定義命令來讓webpack打包,咱們能夠在package.json的script中配置一下命令,如:
"scripts": { "test": "echo \"Error: no test specified\" && exit 1", "build":"npx webpack -c webpack.config.js" },
以後咱們執行 npm run build就可讓webpack打包了
上面的-c webpack.config.js指的是 webpack是根據哪一個文件的配置打包的
----------------------------------------------------------------------------------------------------------------------------
因爲webpack是將全部的依賴文件打包成一個文件,當咱們想調試css樣式時,咱們很難在控制檯看到某一句代碼是來自哪一個源文件的,因此咱們須要開啓sourceMap,
在webpack.config.js中國這樣配置:
module: { rules: [ { test: /\.(sc|c|sa)ss$/,//scss,css,sass use: ["style-loader",{ loader:"css-loader", options:{ sourceMap:true } },{ loader:"sass-loader", options:{ sourceMap:true } }], } ] }
而後執行npm run build 在控制檯查看css樣式,就能夠清晰的看到某個樣式,是來自哪個文件(index.css仍是a.scss一目瞭然)
------------------------------------------------------------------------------------------------------------
另外咱們通常還會用到postcss 以及 autuoprefixer
postcss 能夠對css進行預處理 校驗css 以及自動添加前綴 能夠提早使用css的一些新特性
首先安裝 (咱們此處只用了 自動添加前綴的插件 因此額外安裝了autoprefixer)
npm i -D postcss-loader
npm install --save-dev autoprefixer
在webpack.config.js中添加對應配置:
module: { rules: [ { test: /\.(sc|c|sa)ss$/,//scss,css,sass use: ["style-loader",{ loader:"css-loader", options:{ sourceMap:true } },{ loader:"postcss-loader", options:{ ident:"postcss",//惟一標識,建議使用postcss sourceMap:true, plugins:(loader)=>[ require("autoprefixer")({overrideBrowserslist:["> 0.15% in CN"]}),//瀏覽器 份額大於0.15% 在中國 (已經包括IE8了)
] } },{ loader:"sass-loader", options:{ sourceMap:true } }], } ] }
----------------------------------------------------------------------------------------------------
將css文件單獨抽離出來
npm install --save-dev mini-css-extract-plugin
通常咱們都是在生產環境將css文件單獨抽離出來的,因此咱們在根目錄中建立webpack.product.config.js文件,用來配置生產環境下的webpack配置,將上面的webpack.config.js中的配置複製一份過來,作如下改變:
const path = require("path"); const MiniCssExtractPlugin = require('mini-css-extract-plugin'); module.exports={ entry:"./src/index.js",//入口文件 mode:"production",//模式是開發環境 output:{//出口文件時main.js,打包到當前目錄的dist文件夾下 filename:"main.js", path:path.resolve(__dirname,"dist") }, module: { rules: [ { test: /\.(sc|c|sa)ss$/,//scss,css,sass use: [ MiniCssExtractPlugin.loader,{ loader:"css-loader", options:{ sourceMap:true } },{ loader:"postcss-loader", options:{ ident:"postcss",//惟一標識,建議使用postcss sourceMap:true, plugins:(loader)=>[ require("autoprefixer")({overrideBrowserslist:["> 0.15% in CN"]}),//瀏覽器 份額大於0.15% 在中國 (已經包括IE8了) ] } },{ loader:"sass-loader", options:{ sourceMap:true } }], } ] }, plugins: [ new MiniCssExtractPlugin({ // Options similar to the same options in webpackOptions.output // both options are optional filename:'[name].[hash].css', chunkFilename:'[id].[hash].css', }) ], }
執行以下命令:
npx webpack --config webpack.product.config.js
就能夠用這個配置文件打包了
固然,若是咱們須要屢次打包 這樣輸入命令顯得有點複雜,咱們能夠在package.json中的script中增長一個腳本命令:
"dist": "npx webpack --config webpack.product.config.js"
以後,運行npm run dist與上述命令等效
----------------------------------------------------------------------------------------------------------------------------------
css壓縮:(生產環境才能用到)
安裝這個插件
npm install optimize-css-assets-webpack-plugin --save-dev
在webpack.product.config.js配置:
const path = require("path"); const MiniCssExtractPlugin = require('mini-css-extract-plugin'); const OptimizeCSSAssetsPlutin=require('optimize-css-assets-webpack-plugin'); module.exports={ entry:"./src/index.js",//入口文件 mode:"production",//模式是開發環境 output:{//出口文件時main.js,打包到當前目錄的dist文件夾下 filename:"main.js", path:path.resolve(__dirname,"dist") }, module: { rules: [ { test: /\.(sc|c|sa)ss$/,//scss,css,sass use: [ MiniCssExtractPlugin.loader,{ loader:"css-loader", options:{ sourceMap:true } },{ loader:"postcss-loader", options:{ ident:"postcss",//惟一標識,建議使用postcss sourceMap:true, plugins:(loader)=>[ require("autoprefixer")({overrideBrowserslist:["> 0.15% in CN"]}),//瀏覽器 份額大於0.15% 在中國 (已經包括IE8了) ] } },{ loader:"sass-loader", options:{ sourceMap:true } }], } ] }, plugins: [ new MiniCssExtractPlugin({ // Options similar to the same options in webpackOptions.output // both options are optional filename:'[name].css', chunkFilename:'[id].css', }) ], optimization:{ minimizer:[new OptimizeCSSAssetsPlutin({})] } }
以後執行 npm run dist打包 便可壓縮css代碼
-------------------------------------------------------------------
js壓縮:(生產環境用)
npm i -D uglifyjs-webpack-plugin
在webpack.product.config.js中加入配置:
const path = require("path"); const MiniCssExtractPlugin = require('mini-css-extract-plugin'); const OptimizeCSSAssetsPlutin=require('optimize-css-assets-webpack-plugin'); const UglifyJsPlugin = require("uglifyjs-webpack-plugin"); module.exports={ entry:"./src/index.js",//入口文件 mode:"production",//模式是開發環境 output:{//出口文件時main.js,打包到當前目錄的dist文件夾下 filename:"main.js", path:path.resolve(__dirname,"dist") }, module: { rules: [ { test: /\.(sc|c|sa)ss$/,//scss,css,sass use: [ MiniCssExtractPlugin.loader,{ loader:"css-loader", options:{ sourceMap:true } },{ loader:"postcss-loader", options:{ ident:"postcss",//惟一標識,建議使用postcss sourceMap:true, plugins:(loader)=>[ require("autoprefixer")({overrideBrowserslist:["> 0.15% in CN"]}),//瀏覽器 份額大於0.15% 在中國 (已經包括IE8了) ] } },{ loader:"sass-loader", options:{ sourceMap:true } }], }, // { // test: /\.js$/, // loader: 'babel-loader', // exclude: /node_modules/, // } ] }, plugins: [ new MiniCssExtractPlugin({ // Options similar to the same options in webpackOptions.output // both options are optional filename:'[name].css', chunkFilename:'[id].css', }) ], optimization:{ minimizer:[ new UglifyJsPlugin({ cache: true, parallel: true, /** * sourceMap 和 devtool: 'inline-source-map', 衝突 */ sourceMap: false, // set to true if you want JS source maps, /** * extractComments 導出備註 */ extractComments: 'all' }), new OptimizeCSSAssetsPlutin({}) ] } }
而後執行npm run dist 就行
----------------------------------------------------------------------------------
將es6轉化轉義成es5
安裝:
npm i -D babel-loader babel-core babel-preset-env
在根目錄新建一個.babelrc文件
配置上:
{ "presets": ["@babel/env"] }
在webpack.product.config.js中配置:
rules: [ { test: /\.js$/, loader: 'babel-loader', exclude: /node_modules/ } ]
--------------------------------------------------------------------------
如何將每次打包的js和css文件 自動引入到html文件中:
npm install html-webpack-plugin -D
在config.js中配置:
const path = require("path"); const MiniCssExtractPlugin = require('mini-css-extract-plugin'); const OptimizeCSSAssetsPlutin=require('optimize-css-assets-webpack-plugin'); const UglifyJsPlugin = require("uglifyjs-webpack-plugin"); const HtmlWebpackPlugin = require("html-webpack-plugin"); module.exports={ entry:"./src/index.js",//入口文件 mode:"production",//模式是開發環境 output:{//出口文件時main.js,打包到當前目錄的dist文件夾下 filename:"main.[hash].js", path:path.resolve(__dirname,"dist") }, module: { rules: [ { test: /\.(sc|c|sa)ss$/,//scss,css,sass use: [ MiniCssExtractPlugin.loader,{ loader:"css-loader", options:{ sourceMap:true } },{ loader:"postcss-loader", options:{ ident:"postcss",//惟一標識,建議使用postcss sourceMap:true, plugins:(loader)=>[ require("autoprefixer")({overrideBrowserslist:["> 0.15% in CN"]}),//瀏覽器 份額大於0.15% 在中國 (已經包括IE8了) ] } },{ loader:"sass-loader", options:{ sourceMap:true } }], }, { test: /\.js$/, loader: 'babel-loader', exclude: /node_modules/ } ] }, plugins: [ new MiniCssExtractPlugin({ // Options similar to the same options in webpackOptions.output // both options are optional filename:'[name][hash].css', chunkFilename:'[id][hash].css', }), new HtmlWebpackPlugin({ title:"webpack 溫習",//默認值webpack App filename:"main.html",//默認值index.html 是最終生成的文件名字 template:path.resolve(__dirname,"src/index.html"), minify:{ collapseWhitespace:true,//是否去空白 removeComments:true,//是否移除註釋 removeAttributeQuotes:true,//移除屬性的引號 } }) ], optimization:{ minimizer:[ new UglifyJsPlugin({ cache: true, parallel: true, /** * sourceMap 和 devtool: 'inline-source-map', 衝突 */ sourceMap: false, // set to true if you want JS source maps, /** * extractComments 導出備註 */ extractComments: 'all' }), new OptimizeCSSAssetsPlutin({}) ] } }
固然,須要在src下簡歷一個index.html模板
而後,執行npm run dist 便可
-----------------------------------------------------------------------
清理dist目錄
每次打包 都會生成一些新的打包文件,從而以前的沒用的打包文件也會保留下來,很不爽,因此咱們須要一個自動清理dist目錄的插件
npm install clean-webpack-plugin --save-dev
在config.js中配置:
const path = require("path"); const MiniCssExtractPlugin = require('mini-css-extract-plugin'); const OptimizeCSSAssetsPlutin=require('optimize-css-assets-webpack-plugin'); const UglifyJsPlugin = require("uglifyjs-webpack-plugin"); const HtmlWebpackPlugin = require("html-webpack-plugin"); const {CleanWebpackPlugin} = require('clean-webpack-plugin'); module.exports={ entry:"./src/index.js",//入口文件 mode:"production",//模式是開發環境 output:{//出口文件時main.js,打包到當前目錄的dist文件夾下 filename:"main.[hash].js", path:path.resolve(__dirname,"dist") }, module: { rules: [ { test: /\.(sc|c|sa)ss$/,//scss,css,sass use: [ MiniCssExtractPlugin.loader,{ loader:"css-loader", options:{ sourceMap:true } },{ loader:"postcss-loader", options:{ ident:"postcss",//惟一標識,建議使用postcss sourceMap:true, plugins:(loader)=>[ require("autoprefixer")({overrideBrowserslist:["> 0.15% in CN"]}),//瀏覽器 份額大於0.15% 在中國 (已經包括IE8了) ] } },{ loader:"sass-loader", options:{ sourceMap:true } }], }, { test: /\.js$/, loader: 'babel-loader', exclude: /node_modules/ } ] }, plugins: [ new MiniCssExtractPlugin({ // Options similar to the same options in webpackOptions.output // both options are optional filename:'[name][hash].css', chunkFilename:'[id][hash].css', }), new HtmlWebpackPlugin({ title:"webpack 溫習",//默認值webpack App filename:"main.html",//默認值index.html 是最終生成的文件名字 template:path.resolve(__dirname,"src/index.html"), minify:{ collapseWhitespace:true,//是否去空白 removeComments:true,//是否移除註釋 removeAttributeQuotes:true,//移除屬性的引號 } }), new CleanWebpackPlugin(),//清理構建文件夾 ], optimization:{ minimizer:[ new UglifyJsPlugin({ cache: true, parallel: true, /** * sourceMap 和 devtool: 'inline-source-map', 衝突 */ sourceMap: false, // set to true if you want JS source maps, /** * extractComments 導出備註 */ extractComments: 'all' }), new OptimizeCSSAssetsPlutin({}) ] } }
而後再次構建,dist目錄會被清理一下再生成打包文件
--------------------------------------------------------------------------------------------------------
webpack處理圖片
首先 打包時處理不了圖片這種二進制文件的 路徑,咱們須要用一個file-loader插件
安裝:
npm install --save-dev file-loader
在config.js中配置:
const path = require("path"); const MiniCssExtractPlugin = require('mini-css-extract-plugin'); const OptimizeCSSAssetsPlutin=require('optimize-css-assets-webpack-plugin'); const UglifyJsPlugin = require("uglifyjs-webpack-plugin"); const HtmlWebpackPlugin = require("html-webpack-plugin"); const {CleanWebpackPlugin} = require('clean-webpack-plugin'); module.exports={ entry:"./src/index.js",//入口文件 mode:"production",//模式是開發環境 output:{//出口文件時main.js,打包到當前目錄的dist文件夾下 filename:"main.[hash].js", path:path.resolve(__dirname,"dist") }, module: { rules: [ { test: /\.(sc|c|sa)ss$/,//scss,css,sass use: [ MiniCssExtractPlugin.loader,{ loader:"css-loader", options:{ sourceMap:true } },{ loader:"postcss-loader", options:{ ident:"postcss",//惟一標識,建議使用postcss sourceMap:true, plugins:(loader)=>[ require("autoprefixer")({overrideBrowserslist:["> 0.15% in CN"]}),//瀏覽器 份額大於0.15% 在中國 (已經包括IE8了) ] } },{ loader:"sass-loader", options:{ sourceMap:true } }], }, { test: /\.js$/, loader: 'babel-loader', exclude: /node_modules/ }, {//處理圖片 路徑 test:/\.(png|svg|gif|jpg|jpeg)$/, use:[ 'file-loader' ] } ] }, plugins: [ new MiniCssExtractPlugin({ // Options similar to the same options in webpackOptions.output // both options are optional filename:'[name][hash].css', chunkFilename:'[id][hash].css', }), new HtmlWebpackPlugin({ title:"webpack 溫習",//默認值webpack App filename:"main.html",//默認值index.html 是最終生成的文件名字 template:path.resolve(__dirname,"src/index.html"), minify:{ collapseWhitespace:true,//是否去空白 removeComments:true,//是否移除註釋 removeAttributeQuotes:true,//移除屬性的引號 } }), new CleanWebpackPlugin(),//清理構建文件夾 ], optimization:{ minimizer:[ new UglifyJsPlugin({ cache: true, parallel: true, /** * sourceMap 和 devtool: 'inline-source-map', 衝突 */ sourceMap: false, // set to true if you want JS source maps, /** * extractComments 導出備註 */ extractComments: 'all' }), new OptimizeCSSAssetsPlutin({}) ] } }
這樣,打包時,圖片路徑就不會報錯了
打包後,dist中會多出打包後的圖片文件
那麼,若是咱們想將圖片進行優化呢?
咱們須要藉助一個插件:
npm install image-webpack-loader --save-dev
config.js配置:
const path = require("path"); const MiniCssExtractPlugin = require('mini-css-extract-plugin'); const OptimizeCSSAssetsPlutin=require('optimize-css-assets-webpack-plugin'); const UglifyJsPlugin = require("uglifyjs-webpack-plugin"); const HtmlWebpackPlugin = require("html-webpack-plugin"); const {CleanWebpackPlugin} = require('clean-webpack-plugin'); module.exports={ entry:"./src/index.js",//入口文件 mode:"production",//模式是開發環境 output:{//出口文件時main.js,打包到當前目錄的dist文件夾下 filename:"main.[hash].js", path:path.resolve(__dirname,"dist") }, module: { rules: [ { test: /\.(sc|c|sa)ss$/,//scss,css,sass use: [ MiniCssExtractPlugin.loader,{ loader:"css-loader", options:{ sourceMap:true } },{ loader:"postcss-loader", options:{ ident:"postcss",//惟一標識,建議使用postcss sourceMap:true, plugins:(loader)=>[ require("autoprefixer")({overrideBrowserslist:["> 0.15% in CN"]}),//瀏覽器 份額大於0.15% 在中國 (已經包括IE8了) ] } },{ loader:"sass-loader", options:{ sourceMap:true } }], }, { test: /\.js$/, loader: 'babel-loader', exclude: /node_modules/ }, {//處理圖片 路徑 test:/\.(png|svg|gif|jpg|jpeg)$/, include:[path.resolve(__dirname,'src/')], use:[ 'file-loader', { loader: 'image-webpack-loader', }, ] } ] }, plugins: [ new MiniCssExtractPlugin({ // Options similar to the same options in webpackOptions.output // both options are optional filename:'[name][hash].css', chunkFilename:'[id][hash].css', }), new HtmlWebpackPlugin({ title:"webpack 溫習",//默認值webpack App filename:"main.html",//默認值index.html 是最終生成的文件名字 template:path.resolve(__dirname,"src/index.html"), minify:{ collapseWhitespace:true,//是否去空白 removeComments:true,//是否移除註釋 removeAttributeQuotes:true,//移除屬性的引號 } }), new CleanWebpackPlugin(),//清理構建文件夾 ], optimization:{ minimizer:[ new UglifyJsPlugin({ cache: true, parallel: true, /** * sourceMap 和 devtool: 'inline-source-map', 衝突 */ sourceMap: false, // set to true if you want JS source maps, /** * extractComments 導出備註 */ extractComments: 'all' }), new OptimizeCSSAssetsPlutin({}) ] } }
--------------------------------------------------------------------------------
將圖片進一步優化處理 成base64
將圖片轉化成base64的dataurl的形式,提升頁面性能
npm install --save-dev url-loader
咱們只須要將file-loader變成url-loader便可:
const path = require("path"); const MiniCssExtractPlugin = require('mini-css-extract-plugin'); const OptimizeCSSAssetsPlutin=require('optimize-css-assets-webpack-plugin'); const UglifyJsPlugin = require("uglifyjs-webpack-plugin"); const HtmlWebpackPlugin = require("html-webpack-plugin"); const {CleanWebpackPlugin} = require('clean-webpack-plugin'); module.exports={ entry:"./src/index.js",//入口文件 mode:"production",//模式是開發環境 output:{//出口文件時main.js,打包到當前目錄的dist文件夾下 filename:"main.[hash].js", path:path.resolve(__dirname,"dist") }, module: { rules: [ { test: /\.(sc|c|sa)ss$/,//scss,css,sass use: [ MiniCssExtractPlugin.loader,{ loader:"css-loader", options:{ sourceMap:true } },{ loader:"postcss-loader", options:{ ident:"postcss",//惟一標識,建議使用postcss sourceMap:true, plugins:(loader)=>[ require("autoprefixer")({overrideBrowserslist:["> 0.15% in CN"]}),//瀏覽器 份額大於0.15% 在中國 (已經包括IE8了) ] } },{ loader:"sass-loader", options:{ sourceMap:true } }], }, { test: /\.js$/, loader: 'babel-loader', exclude: /node_modules/ }, {//處理圖片 路徑 test:/\.(png|svg|gif|jpg|jpeg)$/, include:[path.resolve(__dirname,'src/')], use:[ { loader:'url-loader', options:{//小於10000字節的圖片轉換成base64格式 limit:10000 } }, { loader: 'image-webpack-loader', }, ] } ] }, plugins: [ new MiniCssExtractPlugin({ // Options similar to the same options in webpackOptions.output // both options are optional filename:'[name][hash].css', chunkFilename:'[id][hash].css', }), new HtmlWebpackPlugin({ title:"webpack 溫習",//默認值webpack App filename:"main.html",//默認值index.html 是最終生成的文件名字 template:path.resolve(__dirname,"src/index.html"), minify:{ collapseWhitespace:true,//是否去空白 removeComments:true,//是否移除註釋 removeAttributeQuotes:true,//移除屬性的引號 } }), new CleanWebpackPlugin(),//清理構建文件夾 ], optimization:{ minimizer:[ new UglifyJsPlugin({ cache: true, parallel: true, /** * sourceMap 和 devtool: 'inline-source-map', 衝突 */ sourceMap: false, // set to true if you want JS source maps, /** * extractComments 導出備註 */ extractComments: 'all' }), new OptimizeCSSAssetsPlutin({}) ] } }
----------------------------------------------------------------------------------
如何將不一樣環境的webpack配置文件合併,將共同配置共用?
npm install --save-dev webpack-merge
首先,咱們須要改變配置文件的結構,以前是webpack.config.js和webpack.product.config.js分別充當 開發和生產環境配置,
如今咱們分爲webpack.common.js、webpack.dev.js、webpack.prod.js 這三個文件分別寫着公共配置、開發環境特有配置、生產環境特有配置
下面寫出柵格文件的內容:
webpack.common.js:
const path = require("path"); const MiniCssExtractPlugin = require('mini-css-extract-plugin'); const OptimizeCSSAssetsPlutin=require('optimize-css-assets-webpack-plugin'); const UglifyJsPlugin = require("uglifyjs-webpack-plugin"); const HtmlWebpackPlugin = require("html-webpack-plugin"); const {CleanWebpackPlugin} = require('clean-webpack-plugin'); module.exports={ entry:"./src/index.js",//入口文件 module: { rules: [ { test: /\.js$/, loader: 'babel-loader', exclude: /node_modules/ }, {//處理圖片 路徑 test:/\.(png|svg|gif|jpg|jpeg)$/, include:[path.resolve(__dirname,'src/')], use:[ { loader:'url-loader', options:{//小於10000字節的圖片轉換成base64格式 limit:10000 } }, { loader: 'image-webpack-loader', }, ] } ] }, plugins: [ new HtmlWebpackPlugin({ title:"webpack 溫習",//默認值webpack App filename:"main.html",//默認值index.html 是最終生成的文件名字 template:path.resolve(__dirname,"src/index.html"), minify:{ collapseWhitespace:true,//是否去空白 removeComments:true,//是否移除註釋 removeAttributeQuotes:true,//移除屬性的引號 } }), new CleanWebpackPlugin(),//清理構建文件夾 ], }
webpack.dev.js:
const path = require("path"); const merge = require('webpack-merge');//引入webpack-merge參數 const common = require('./webpack.common');//將webpack.common.js引入 let devConfig={ mode:"development",//模式是開發環境 output:{//出口文件時main.js,打包到當前目錄的dist文件夾下 filename:"main.js", path:path.resolve(__dirname,"dist") }, module: { rules: [ { test: /\.(sc|c|sa)ss$/,//scss,css,sass use: ["style-loader",{ loader:"css-loader", options:{ sourceMap:true } },{ loader:"postcss-loader", options:{ ident:"postcss",//惟一標識,建議使用postcss sourceMap:true, plugins:(loader)=>[ require("autoprefixer")({overrideBrowserslist:["> 0.15% in CN"]}),//瀏覽器 份額大於0.15% 在中國 (已經包括IE8了) ] } },{ loader:"sass-loader", options:{ sourceMap:true } }], } ] } } module.exports=merge(common,devConfig);//第一個參數是基本配置 後面的參數是當前配置
webpack.prod.js:
const path = require("path"); const MiniCssExtractPlugin = require('mini-css-extract-plugin'); const OptimizeCSSAssetsPlutin=require('optimize-css-assets-webpack-plugin'); const UglifyJsPlugin = require("uglifyjs-webpack-plugin"); const HtmlWebpackPlugin = require("html-webpack-plugin"); const {CleanWebpackPlugin} = require('clean-webpack-plugin'); const merge = require('webpack-merge');//引入webpack-merge參數 const common = require('./webpack.common');//將webpack.common.js引入 let prodConfig={ mode:"production",//模式是開發環境 output:{//出口文件時main.js,打包到當前目錄的dist文件夾下 filename:"main.[hash].js", path:path.resolve(__dirname,"dist") }, module: { rules: [ { test: /\.(sc|c|sa)ss$/,//scss,css,sass use: [ MiniCssExtractPlugin.loader,{ loader:"css-loader", options:{ sourceMap:true } },{ loader:"postcss-loader", options:{ ident:"postcss",//惟一標識,建議使用postcss sourceMap:true, plugins:(loader)=>[ require("autoprefixer")({overrideBrowserslist:["> 0.15% in CN"]}),//瀏覽器 份額大於0.15% 在中國 (已經包括IE8了) ] } },{ loader:"sass-loader", options:{ sourceMap:true } }], }, { test: /\.js$/, loader: 'babel-loader', exclude: /node_modules/ }, ] }, plugins: [ new MiniCssExtractPlugin({ // Options similar to the same options in webpackOptions.output // both options are optional filename:'[name][hash].css', chunkFilename:'[id][hash].css', }), ], optimization:{ minimizer:[ new UglifyJsPlugin({ cache: true, parallel: true, /** * sourceMap 和 devtool: 'inline-source-map', 衝突 */ sourceMap: false, // set to true if you want JS source maps, /** * extractComments 導出備註 */ extractComments: 'all' }), new OptimizeCSSAssetsPlutin({}) ] } } module.exports=merge(common,prodConfig);
還有在package.json中記得把執行命令的--config改一下
{ "name": "webpack1", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "build": "npx webpack --config webpack.dev.js", "dist": "npx webpack --config webpack.prod.js" }, "keywords": [], "author": "", "license": "ISC", "devDependencies": { "@babel/core": "^7.6.0", "@babel/plugin-transform-runtime": "^7.6.0", "@babel/preset-env": "^7.6.0", "@babel/runtime-corejs2": "^7.6.0", "autoprefixer": "^9.6.1", "babel-loader": "^8.0.6", "clean-webpack-plugin": "^3.0.0", "css-loader": "^3.2.0", "file-loader": "^4.2.0", "html-webpack-plugin": "^3.2.0", "image-webpack-loader": "^6.0.0", "mini-css-extract-plugin": "^0.8.0", "node-sass": "^4.12.0", "optimize-css-assets-webpack-plugin": "^5.0.3", "postcss-loader": "^3.0.0", "sass-loader": "^8.0.0", "style-loader": "^1.0.0", "uglifyjs-webpack-plugin": "^2.2.0", "url-loader": "^2.1.0", "webpack": "^4.39.3", "webpack-cli": "^3.3.8", "webpack-merge": "^4.2.2" }, "dependencies": { "@babel/polyfill": "^7.6.0", "@babel/runtime": "^7.6.0", "lodash": "^4.17.15" } }
------------------------------------------------------------------------------------------------------------------------------
js啓用sourcemap
webpack4默承認以啓用sourcemap
只須要在config文件中加上:(這個一般放在開發環境中)
devtool:'inline-source-map'
這樣在開發環境下,就能夠看到執行的js具體是在哪一個文件下的第幾行執行的
-----------------------------------------------------------------------------------------------------------------
監控文件變化,啓用watch,當代碼發生變化時,自動編譯,自動打包
在webpack啓動的時候 加上一個 --watch命令
"scripts": { "test": "echo \"Error: no test specified\" && exit 1", "build": "npx webpack --watch --config webpack.dev.js", "dist": "npx webpack --config webpack.prod.js" },
-------------------------------------------------------------------------------------------------------------------
webpack-dev-server和熱更新
webpack-dev-server提供了一個Web服務器,可以實加載,它內置了webpack的編譯功能,是直接編譯在內存裏,而不是編譯在dist文件裏,
先安裝webpack-dev-server
npm install --save-dev webpack-dev-server
在webpack.dev.js:
const path = require("path"); const merge = require('webpack-merge');//引入webpack-merge參數 const common = require('./webpack.common');//將webpack.common.js引入 const webpack = require('webpack'); let devConfig={ mode:"development",//模式是開發環境 devtool:'inline-source-map',//開啓sourcemap 方便js調試 output:{//出口文件時main.js,打包到當前目錄的dist文件夾下 filename:"main.js", path:path.resolve(__dirname,"dist") }, devServer: { contentBase: path.join(__dirname,"dist"), //告訴服務器 哪裏提供內容,默認狀況下將使用當前工做目錄做爲提供內容的目錄 port: 8080, //端口號設爲8080, 默認也是8080 clientLogLevel:'warning',//可能的值none、error、warning、info(默認值) hot:true,//啓用webpack的模塊熱替換特性,這個須要配合webpack.HotModuleReplacementPlugin插件 compress:true,//一切服務都啓用gzip壓縮 host:'localhost',//指定使用一個host,默認是localhost,若是你但願服務器外部可訪問0.0.0.0 open:true,//是否打開瀏覽器 overlay:{//出現錯誤或者警告的時候,是否覆蓋頁面線上錯誤消息 warnings:true, errors:true }, publicPath:'/',//此路徑下的打包文件 可在瀏覽器上訪問 proxy:{ "/api":{ target:"http://192.168.0.102:8080", pathRewrite:{ "^/api":"/mockjsdata/5/api", // /api/getuser => http://192.168.0.102:8080/mockjsdata/5/api/getuser } } }, quiet:true,//啓動quiet後,除了初始啓動信息以外的任何內容都不會顯示 watchOptions:{//監視文件相關控制選項 poll:true,//webpack使用文件系統(file system)獲取文件改動的通知,在某些狀況下不會正常工做 ignored:/node_modules/,//忽略監控的文件夾,正則 aggregateTimeout:300,//默認值,當第一個文件改變,會在從新構建前增長延遲 } }, module: { rules: [ { test: /\.(sc|c|sa)ss$/,//scss,css,sass use: ["style-loader",{ loader:"css-loader", options:{ sourceMap:true } },{ loader:"postcss-loader", options:{ ident:"postcss",//惟一標識,建議使用postcss sourceMap:true, plugins:(loader)=>[ require("autoprefixer")({overrideBrowserslist:["> 0.15% in CN"]}),//瀏覽器 份額大於0.15% 在中國 (已經包括IE8了) ] } },{ loader:"sass-loader", options:{ sourceMap:true } }], } ] }, plugins:[ new webpack.NamedModulesPlugin(),//更容易查看path 的估值 new webpack.HotModuleReplacementPlugin(),//替換插件 ] } module.exports=merge(common,devConfig);//第一個參數是基本配置 後面的參數是當前配置
以後執行 npx webpack-dev-server --config webpack.dev.js 就會打開服務器,另外須要注意的是,webpack-dev-server內置了webpack的打包功能,可是它時打包到了內存中,而不是dist文件中
固然每次這樣執行命令太長了,就把它加到script的命令中:
"start": "npx webpack-dev-server --config webpack.dev.js"
-------------------------------------------------------------------------------------------------------------
babel優化
js啓用babel轉碼:es6轉化爲es5
安裝
npm i -D babel-loader babel-core babel-preset-env
在公共webpack.common.js中添加:
module: {
rules: [
{
},
]
},
記得在根目錄下建立一個.babelrc文件
{ "presets": ["@babel/env"] }
----------------------------------
另外 咱們在項目中可能在多個模塊中重複引用同個文件,這樣當babel轉碼時會一次性將這些重複文件都轉碼過去,形成文件體積變大,此時須要用到插件,將這些公共的文件提取出來。
npm install babel-plugin-transform-runtime --save-dev
npm install babel-runtime --save
在.babelrc中配置:
{ "presets": ["@babel/env"] }
------------------------------------------------------------------------------------------
eslint校驗:
安裝:
npm install eslint --save-dev
npm install eslint-loader --save-dev
如下是用到的額外的須要安裝的eslint的解釋器、校驗規則等
npm i -D babel-eslint standard
在common.js中增長配置
const path = require("path"); const MiniCssExtractPlugin = require('mini-css-extract-plugin'); const OptimizeCSSAssetsPlutin=require('optimize-css-assets-webpack-plugin'); const UglifyJsPlugin = require("uglifyjs-webpack-plugin"); const HtmlWebpackPlugin = require("html-webpack-plugin"); const {CleanWebpackPlugin} = require('clean-webpack-plugin'); module.exports={ entry:"./src/index.js",//入口文件 module: { rules: [ { test: /\.js$/, exclude: /node_modules/, use:[{ loader: 'babel-loader', options:{ cacheDirectory:true,//開啓緩存 加快babel轉碼 } },{//必定要放在下面 先執行eslint檢測 再轉義 由於webpack是從後往前執行的 loader:'eslint-loader', options:{ fix:true,//若有語法錯誤 自動修復 } }] }, {//處理圖片 路徑 test:/\.(png|svg|gif|jpg|jpeg)$/, include:[path.resolve(__dirname,'src/')], use:[ { loader:'url-loader', options:{//小於10000字節的圖片轉換成base64格式 limit:10000 } }, { loader: 'image-webpack-loader', }, ] } ] }, plugins: [ new HtmlWebpackPlugin({ title:"webpack 溫習",//默認值webpack App filename:"main.html",//默認值index.html 是最終生成的文件名字 template:path.resolve(__dirname,"src/index.html"), minify:{ collapseWhitespace:true,//是否去空白 removeComments:true,//是否移除註釋 removeAttributeQuotes:true,//移除屬性的引號 } }), new CleanWebpackPlugin(),//清理構建文件夾 ], }
在跟目錄添加.eslintrc.js文件
module.exports={ root:true,//是否是咱們的根目錄 parserOptions: { parser:'babel-eslint' }, env:{ browser:true, }, extends:[ 'standard' ], globals:{ NODE_ENV:false }, rules:{ 'generator-star-spacing':'off', 'no-debugger': process.env.NODE_ENV === 'production' ? 'error':'off', //添加分號 必須 'semi':['error','always'], 'no-unexpected-multiline':'off', 'space-before-function-paren':['error','never'], 'quotes':[ 'error', 'single', { 'avoidEscape':true } ] } }
在根目錄加.eslintignore文件
/dist/ /node-modules/ /*.js
--------------------------------------------------------------------------------------------
resolve解析,當咱們引入一個文件時,好比import _ from './src/dev.js'
咱們能夠將路徑配置一個別名,方便引入模塊
在common.js中能夠加一條配置:
const path = require("path"); const MiniCssExtractPlugin = require('mini-css-extract-plugin'); const OptimizeCSSAssetsPlutin=require('optimize-css-assets-webpack-plugin'); const UglifyJsPlugin = require("uglifyjs-webpack-plugin"); const HtmlWebpackPlugin = require("html-webpack-plugin"); const {CleanWebpackPlugin} = require('clean-webpack-plugin'); module.exports={ entry:"./src/index.js",//入口文件 resolve:{ alias:{ '@':path.resolve(__dirname,'src/') }, extensions:[".js",".vue",".json"],//默認.js .json }, module: { rules: [ { test: /\.js$/, exclude: /node_modules/, use:[{ loader: 'babel-loader', options:{ cacheDirectory:true,//開啓緩存 加快babel轉碼 } },{//必定要放在下面 先執行eslint檢測 再轉義 由於webpack是從後往前執行的 loader:'eslint-loader', options:{ fix:true,//若有語法錯誤 自動修復 } }] }, {//處理圖片 路徑 test:/\.(png|svg|gif|jpg|jpeg)$/, include:[path.resolve(__dirname,'src/')], use:[ { loader:'url-loader', options:{//小於10000字節的圖片轉換成base64格式 limit:10000 } }, { loader: 'image-webpack-loader', }, ] } ] }, plugins: [ new HtmlWebpackPlugin({ title:"webpack 溫習",//默認值webpack App filename:"main.html",//默認值index.html 是最終生成的文件名字 template:path.resolve(__dirname,"src/index.html"), minify:{ collapseWhitespace:true,//是否去空白 removeComments:true,//是否移除註釋 removeAttributeQuotes:true,//移除屬性的引號 } }), new CleanWebpackPlugin(),//清理構建文件夾 ], }
---------------------------------------------------------------------------------
webpack 配置外部拓展(externals) cdn也能夠全局引入
在common.js中再增長一個配置 已引入jquery爲例
externals:{ jquery:"jQuery",//寫法有多種能夠查一下 },
這樣就能夠在main,js中import $ from 'jquery' 來全局引入jquery 另外這樣作有個好處就是 jquery不會打包到bundle裏去 大大減小文件體積
-----------------------------------------------------------------------------------------
如何讓webpack打包後生成分析報表
安裝
npm install --save-dev webpack-bundle-analyzer
在dev.js中配置
const path = require("path"); const merge = require('webpack-merge');//引入webpack-merge參數 const common = require('./webpack.common');//將webpack.common.js引入 const webpack = require('webpack'); const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; let devConfig={ mode:"development",//模式是開發環境 devtool:'inline-source-map',//開啓sourcemap 方便js調試 output:{//出口文件時main.js,打包到當前目錄的dist文件夾下 filename:"main.js", path:path.resolve(__dirname,"dist") }, devServer: { contentBase: path.join(__dirname,"dist"), //告訴服務器 哪裏提供內容,默認狀況下將使用當前工做目錄做爲提供內容的目錄 port: 8080, //端口號設爲8080, 默認也是8080 clientLogLevel:'warning',//可能的值none、error、warning、info(默認值) hot:true,//啓用webpack的模塊熱替換特性,這個須要配合webpack.HotModuleReplacementPlugin插件 compress:true,//一切服務都啓用gzip壓縮 host:'localhost',//指定使用一個host,默認是localhost,若是你但願服務器外部可訪問0.0.0.0 open:true,//是否打開瀏覽器 overlay:{//出現錯誤或者警告的時候,是否覆蓋頁面線上錯誤消息 warnings:true, errors:true }, publicPath:'/',//此路徑下的打包文件 可在瀏覽器上訪問 proxy:{ "/api":{ target:"http://192.168.0.102:8080", pathRewrite:{ "^/api":"/mockjsdata/5/api", // /api/getuser => http://192.168.0.102:8080/mockjsdata/5/api/getuser } } }, quiet:true,//啓動quiet後,除了初始啓動信息以外的任何內容都不會顯示 watchOptions:{//監視文件相關控制選項 poll:true,//webpack使用文件系統(file system)獲取文件改動的通知,在某些狀況下不會正常工做 ignored:/node_modules/,//忽略監控的文件夾,正則 aggregateTimeout:300,//默認值,當第一個文件改變,會在從新構建前增長延遲 } }, module: { rules: [ { test: /\.(sc|c|sa)ss$/,//scss,css,sass use: ["style-loader",{ loader:"css-loader", options:{ sourceMap:true } },{ loader:"postcss-loader", options:{ ident:"postcss",//惟一標識,建議使用postcss sourceMap:true, plugins:(loader)=>[ require("autoprefixer")({overrideBrowserslist:["> 0.15% in CN"]}),//瀏覽器 份額大於0.15% 在中國 (已經包括IE8了) ] } },{ loader:"sass-loader", options:{ sourceMap:true } }], } ] }, plugins:[ new webpack.NamedModulesPlugin(),//更容易查看path 的估值 new webpack.HotModuleReplacementPlugin(),//替換插件 new BundleAnalyzerPlugin(),//生成打包報表 ] } module.exports=merge(common,devConfig);//第一個參數是基本配置 後面的參數是當前配置
而後 打包一下,就會出現報表