什麼是webpackcss
五個核心概念html
理解Loader前端
理解Pluginsnode
配置文件(默認)webpack
初始化項目:git
生成package.json文件es6
{ "name": "webpack_test", "version": "1.0.0" }
安裝webpackgithub
建立js文件web
建立json文件chrome
建立主頁面:
運行指令
開發配置指令:webpack src/js/app.js -o dist/js/app.js --mode=development
生產配置指令:webpack src/js/app.js -o dist/js/app.js --mode=production
結論:
缺點:
文件內容:
const {resolve} = require('path'); //node內置核心模塊,用來設置路徑。 module.exports = { entry: './src/js/app.js', // 入口文件 output: { // 輸出配置 filename: './js/bundle.js', // 輸出文件名 path: resolve(__dirname, 'dist') //輸出文件路徑配置 }, mode: 'development' //開發環境(二選一) mode: 'production' //生產環境(二選一) };
安裝loader
配置loader
module: { rules: [ { test: /\.js$/, //只檢測js文件 exclude: /node_modules/, //排除node_modules文件夾 enforce: "pre", //提早加載使用 use: { //使用eslint-loader解析 loader: "eslint-loader" } } ] }
修改package.json(須要刪除註釋才能生效)
"eslintConfig": { //eslint配置 "parserOptions": { "ecmaVersion": 8, // es8 "sourceType": "module", // ECMAScript 模塊 } }
安裝loader
配置loader
module: { rules: [ { oneOf: [ //數組中的配置只有一個可以生效, 後面的配置都會放在當前數組中 { test: /\.js$/, exclude: /node_modules/, use: { loader: "babel-loader", options: { presets: ['@babel/preset-env'] } } } ] } ] }
建立less文件
入口app.js文件
安裝loader
配置loader
oneOf: [ { test: /\.less$/, use: [{ loader: "style-loader" }, { loader: "css-loader" }, { loader: "less-loader" }] } ]
添加2張圖片:
安裝loader
配置loader
{ test: /\.(png|jpg|gif|svg)$/, use: [ { loader: 'url-loader', options: { outputPath: 'images/', //在output基礎上,修改輸出圖片文件的位置 publicPath: '../dist/images/', //修改背景圖引入url的路徑 limit: 8 * 1024, // 8kb大小如下的圖片文件都用base64處理 name: '[hash:8].[ext]' // hash值爲7位,ext自動補全文件擴展名 } } ] }
添加html文件
安裝插件Plugins
在webpack.config.js中引入插件(插件都須要手動引入,而loader會自動加載)
配置插件Plugins
plugins: [ new HtmlWebpackPlugin({ template: './src/index.html' }), ]
添加圖片
安裝loader
修改entry
配置loader
{ test: /\.(html)$/, use: { loader: 'html-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; }
配置loader
{ loader: 'file-loader', exclude: [/\.js$/, /\.html$/, /\.json$/], options: { outputPath: 'media/', publicPath: '../dist/media/', name: '[hash:8].[ext]', }, }
安裝loader
引入webpack
修改webpack配置對象(注意不是loader中)
devtool: 'inline-source-map', // 將編譯後的代碼映射回原始源代碼,更容易地追蹤錯誤和警告 devServer: { contentBase: './dist', //項目根路徑 hot: true, //開啓熱模替換功能 open: true //自動打開瀏覽器 }, plugins: [ new webpack.NamedModulesPlugin(), new webpack.HotModuleReplacementPlugin() ]
修改loader部分配置
publicPath: '../dist/images/'
--> publicPath: 'images/'
publicPath: '../dist/media/'
--> publicPath: 'media/'
修改package.json中scripts指令
以上就是webpack開發環境的配置,能夠在內存中自動打包全部類型文件並有自動編譯運行、熱更新等功能。
建立文件夾config,將webpack.config.js複製兩份
修改webpack.prod.js配置,刪除webpack-dev-server配置
module.exports = { output: { filename: 'js/[name].[hash:8].js', //添加了hash值, 實現靜態資源的長期緩存 publicPath: '/' //全部輸出資源公共路徑 }, module: { //loader其餘沒有變化,只放了變化部分,只有須要修改路徑部分改了 rules: [ { oneOf: [ { test: /\.(png|jpg|gif|svg)$/, use: [ { loader: 'url-loader', options: { limit: 8 * 1024, // 8kb大小如下的圖片文件都用base64處理 name: 'images/[name].[hash:8].[ext]' } } ] }, { loader: 'file-loader', exclude: [/\.js$/, /\.html$/, /\.json$/], options: { name: 'media/[name].[hash:8].[ext]', }, } ] } ] }, mode: 'production', //修改成生產環境 }
修改package.json的指令
開發環境指令
生產環境指令
注意: 生產環境代碼須要部署到服務器上才能運行
安裝插件
引入插件
配置插件
new CleanWebpackPlugin()
安裝插件
引入插件
配置loader
{ test: /\.less$/, use: [ MiniCssExtractPlugin.loader, 'css-loader', 'less-loader', ] }
配置插件
new MiniCssExtractPlugin({ filename: "css/[name].[hash:8].css", chunkFilename: "css/[id].[hash:8].css" })
運行指令
安裝loader
配置loader
{ test: /\.less$/, use: [ MiniCssExtractPlugin.loader, 'css-loader', 'postcss-loader', 'less-loader', ] }
在項目根目錄添加postcss配置文件:postcss.config.js
module.exports = { "plugins": { "autoprefixer": { "browsers": [ "ie >= 8", "ff >= 30", "chrome >= 34", "safari >= 8", "opera >= 23" ] } } }
運行指令:
安裝插件
引入插件
配置插件
new OptimizeCssAssetsPlugin({ cssProcessorPluginOptions: { preset: ['default', { discardComments: { removeAll: true } }], }, })
運行指令:
安裝loader
配置loader
{ test: /\.(png|jpg|gif|svg)$/, use: [ { loader: 'url-loader', options: { limit: 8 * 1024, // 8kb大小如下的圖片文件都用base64處理 name: 'images/[name].[hash:8].[ext]' } }, { loader: 'img-loader', options: { plugins: [ require('imagemin-gifsicle')({ interlaced: false }), require('imagemin-mozjpeg')({ progressive: true, arithmetic: false }), require('imagemin-pngquant')({ floyd: 0.5, speed: 2 }), require('imagemin-svgo')({ plugins: [ { removeTitle: true }, { convertPathData: false } ] }) ] } } ] }
運行指令:
修改插件配置
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生產環境的配置,能夠生成打包後的文件。到這裏基本配置已經告一段落了,全部配置我已經放在 倉庫 中
第二期 Webpack4優化教程 已出~ 歡迎關注和提問~