初始化項目:css
生成package.json文件html
{ "name": "webpack_test", "version": "1.0.0" }
安裝webpack前端
目的:在項目根目錄定義配置文件,經過自定義配置文件,還原以上功能vue
文件名稱:webpack.config.jsnode
文件內容:react
const { resolve } = require('path'); //node內置核心模塊,用來設置路徑。 module.exports = { entry: './src/js/app.js', // 入口文件配置(簡寫) /*完整寫法: entry:{ main:'./src/js/app.js' } */ output: { // 輸出配置 filename: './js/built.js', // 輸出文件名 path: resolve(__dirname, 'build') //輸出文件路徑配置 }, mode: 'development' //開發環境(二選一) mode: 'production' //生產環境(二選一) };
運行指令: webpackwebpack
概述:less文件webpack不能解析,須要藉助loader編譯解析es6
建立less文件web
入口app.js文件chrome
安裝loader
配置loader
{ test: /\.less$/, // 檢查文件是否以.less結尾(檢查是不是less文件) use: [ // 數組中loader執行是從下到上,從右到左順序執行 'style-loader', // 建立style標籤,添加上js中的css代碼 'css-loader', // 將css以commonjs方式整合到js文件中 'less-loader' // 將less文件解析成css文件 ] },
運行指令:webpack
概述:對js基本語法錯誤/隱患,進行提早檢查
安裝loader
備註1:在:eslint.org網站 -> userGuide -> Configuring ESLint 查看如何配置
備註2:在:eslint.org網站 -> userGuide -> Rules 查看全部規則
配置loader
module: { rules: [ { test: /\.js$/, //只檢測js文件 exclude: /node_modules/, //排除node_modules文件夾 enforce: "pre", //提早加載使用 use: { //使用eslint-loader解析 loader: "eslint-loader" } } ] }
修改package.json(須要刪除註釋才能生效)
"eslintConfig": { "parserOptions": { "ecmaVersion": 6, // 支持es6 "sourceType": "module" // 使用es6模塊化 }, "env": { // 設置環境 "browser": true, // 支持瀏覽器環境: 可以使用window上的全局變量 "node": true // 支持服務器環境: 可以使用node上global的全局變量 }, "globals": { // 聲明使用的全局變量, 這樣即便沒有定義也不會報錯了 "$": "readonly" // $ 只讀變量 }, "rules": { // eslint檢查的規則 0 忽略 1 警告 2 錯誤 "no-console": 0, // 不檢查console "eqeqeq": 2, // 用==而不用===就報錯 "no-alert": 2 // 不能使用alert }, "extends": "eslint:recommended" // 使用eslint推薦的默認規則 https://cn.eslint.org/docs/rules/ },
運行指令:webpack
概述:將瀏覽器不能識別的新語法轉換成原來識別的舊語法,作瀏覽器兼容性處理
安裝loader
配置loader
module: { rules: [ { test: /\.js$/, exclude: /node_modules/, use: { loader: "babel-loader", options: { presets: ['@babel/preset-env'] } } } ] }
運行指令:webpack
安裝包
使用
- app.js import '@babel/polyfill'; // 包含ES6的高級語法的轉換
優勢:解決babel只能轉換部分低級語法的問題(如:let/const/解構賦值...),引入polyfill能夠轉換高級語法(如:Promise...)
缺點:將全部高級語法都進行了轉換,但實際上可能只使用一部分
解決:須要按需加載(使用了什麼高級語法,就轉換什麼,而其餘的不轉換)
安裝包
配置loader
{ test: /\.js$/, exclude: /(node_modules)/, use: { loader: 'babel-loader', options: { presets: [ [ '@babel/preset-env', { useBuiltIns: 'usage', // 按需引入須要使用polyfill corejs: { version: 3 }, // 解決warn targets: { // 指定兼容性處理哪些瀏覽器 "chrome": "58", "ie": "9", } } ] ], cacheDirectory: true, // 開啓babel緩存 } } },
概述:圖片文件webpack不能解析,須要藉助loader編譯解析
添加2張圖片:
在less文件中經過背景圖的方式引入圖片
安裝loader
配置loader
{ test: /\.(png|jpg|gif)$/, use: { loader: 'url-loader', options: { limit: 8192, // 8kb --> 8kb如下的圖片會base64處理 outputPath: 'images', // 決定文件本地輸出路徑 publicPath: '../build/images', // 決定圖片的url路徑 name: '[hash:8].[ext]' // 修改文件名稱 [hash:8] hash值取8位 [ext] 文件擴展名 } } },
運行指令:webpack
概述:html文件webpack不能解析,須要藉助插件編譯解析
添加html文件
安裝插件Plugins
在webpack.config.js中引入插件(插件都須要手動引入,而loader會自動加載)
配置插件Plugins
plugins: [ new HtmlWebpackPlugin({ template: './src/index.html', // 以當前文件爲模板建立新的HtML(1. 結構和原來同樣 2. 會自動引入打包的資源) }), ]
運行指令:webpack
概述:html中的圖片url-loader無法處理,它只能處理js中引入的圖片 / 樣式中圖片,不能處理html中img標籤,須要引入其餘html-loader處理。
添加圖片
安裝loader
配置loader
{ test: /\.(html)$/, use: { loader: 'html-loader' } }
運行指令:webpack
概述:其餘資源webpack不能解析,須要藉助loader編譯解析
添加字體文件
修改樣式
@font-face { font-family: 'iconfont'; src: url('../media/iconfont.eot'); src: url('../media/iconfont.eot?#iefix') format('embedded-opentype'), url('../media/iconfont.woff2') format('woff2'), url('../media/iconfont.woff') format('woff'), url('../media/iconfont.ttf') format('truetype'), url('../media/iconfont.svg#iconfont') format('svg'); } .iconfont { font-family: "iconfont" !important; font-size: 16px; font-style: normal; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; }
修改html,添加字體
配置loader
{ test: /\.(eot|svg|woff|woff2|ttf|mp3|mp4|avi)$/, // 處理其餘資源 loader: 'file-loader', options: { outputPath: 'media', name: '[hash:8].[ext]' } }
運行指令:webpack
安裝loader
詳細配置見官網:指南 -> 開發環境 -> 使用webpack-dev-server
修改webpack配置對象(注意不是loader中)
devServer: { open: true, // 自動打開瀏覽器 compress: true, // 啓動gzip壓縮 port: 3000, // 端口號 }
修改url-loader部分配置
修改package.json中scripts指令
運行指令:npm run start
概述:熱模塊替換(HMR)是webpack提供的最有用的功能之一。它容許在運行時更新全部類型的模塊,而無需徹底刷新(只更新變化的模塊,不變的模塊不更新)。
詳細配置見官網:指南 -> 模塊熱替換
修改devServer配置
devServer: { contentBase: resolve(__dirname, 'build'), // 運行項目的目錄 open: true, // 自動打開瀏覽器 compress: true, // 啓動gzip壓縮 port: 3000, // 端口號 hot: true // 開啓熱模替換功能 HMR }
問題:html文件沒法自動更新了,須要增長一個入口
entry: ['./src/js/app.js','./src/index.html']
以上就是webpack開發環境的配置,能夠在內存中自動打包全部類型文件並有自動編譯運行、熱更新等功能。
建立文件夾config,將webpack.config.js複製兩份
修改webpack.prod.js配置,刪除webpack-dev-server配置
// / 表明根路徑(等價於這個:http://localhost:5000/),之後項目上線全部路徑都以當前網址爲根路徑出發 module.exports = { output: { path: resolve(__dirname, '../build'), // 文件輸出目錄 filename: './js/built.js', // 文件輸出名稱 publicPath: '/' // 全部輸出資源在引入時的公共路徑,若loader中也指定了publicPath,會以loader的爲準。 }, module: { rules: [ { test: /\.(png|jpg|gif)$/, use: { loader: 'url-loader', options: { limit: 8192, outputPath: 'images', publicPath: '/images', // 重寫publicPath,須要在路徑前面加上 / name: '[hash:8].[ext]' } } }, ] }, mode: 'production', //修改成生產環境 devtool: 'cheap-module-source-map' // 修改成生產環境的錯誤提示 // 刪除devServer }
修改package.json的指令
開發環境指令
生產環境指令
安裝插件
引入插件
配置loader
{ test: /\.less$/, use: [ MiniCssExtractPlugin.loader, 'css-loader', 'less-loader', ] }
配置插件
new MiniCssExtractPlugin({ filename: "css/[name].css", })
運行指令
安裝loader
配置loader
{ test: /\.less$/, use: [ MiniCssExtractPlugin.loader, 'css-loader', { loader: 'postcss-loader', options: { ident: 'postcss', plugins: () => [ require('postcss-flexbugs-fixes'), require('postcss-preset-env')({ autoprefixer: { flexbox: 'no-2009', }, stage: 3, }), require('postcss-normalize')(), ], sourceMap: true, }, }, 'less-loader', ] }
添加配置文件: .browserslistrc
last 1 version > 1% IE 10 # sorry
運行指令:
安裝插件
引入插件
配置插件
new OptimizeCssAssetsPlugin({ cssProcessorPluginOptions: { preset: ['default', { discardComments: { removeAll: true } }], }, cssProcessorOptions: { // 解決沒有source map問題 map: { inline: false, annotation: true, } } })
運行指令:
修改插件配置
new HtmlWebpackPlugin({ template: './src/index.html', minify: { removeComments: true, collapseWhitespace: true, removeRedundantAttributes: true, useShortDoctype: true, removeEmptyAttributes: true, removeStyleLinkTypeAttributes: true, keepClosingSlash: true, minifyJS: true, minifyCSS: true, minifyURLs: true, } })
運行指令:
以上就是webpack生產環境的配置,能夠生成打包後的文件。