摘要:進(jìn)入入口起點(diǎn)后,會(huì)找出有哪些模塊和庫(kù)是入口起點(diǎn)直接和間接依賴的。用于對(duì)模塊的源代碼進(jìn)行轉(zhuǎn)換。指定生產(chǎn)還是開(kāi)發(fā)入口文件打包后的文件名這里需指定一個(gè)絕對(duì)路徑我們需要的模塊去解析路徑包含一系列的規(guī)則是一個(gè)具有屬性的對(duì)象。
前文:
進(jìn)擊webpack 4 (基礎(chǔ)篇 一)
webpack 有4大概念
入口(entry)
輸出(output)
loader
插件(plugins)
入口與出口
//webpack.config.js const path = require("path") module.exports = { mode:"development", // 指定生產(chǎn)還是開(kāi)發(fā) entry:"./src/index.js", // 入口文件 output:{ filename:"bundle.js", // 打包后的文件名 path:path.resolve(__dirname,"./dist") // 這里需指定一個(gè)絕對(duì)路徑 我們需要node的path模塊去解析路徑 } }
mode: 指定環(huán)境是development還是production 決定了打包出來(lái)的文件是壓縮還是未壓縮的
entry: 入口起點(diǎn)(entry point)指示 webpack 應(yīng)該使用哪個(gè)模塊,來(lái)作為構(gòu)建其內(nèi)部依賴圖的開(kāi)始。進(jìn)入入口起點(diǎn)后,webpack 會(huì)找出有哪些模塊和庫(kù)是入口起點(diǎn)(直接和間接)依賴的。 其中分為單入口跟多入口配置 可以是string,array,object
// entry:"./src/index.js" 是下面的簡(jiǎn)寫(xiě) entry:{ main: "./src/index.js" },
output:包含打包后的名字跟路徑, 如果是多入口應(yīng)用, 可以設(shè)置filename為[name].js, entry里的key值會(huì)替換掉name 生成文件夾。
loader
loader 用于對(duì)模塊的源代碼進(jìn)行轉(zhuǎn)換。
const path = require("path") module.exports = { mode:"development", // 指定生產(chǎn)還是開(kāi)發(fā) entry:"./src/index.js", // 入口文件 output:{ filename:"bundle.js", // 打包后的文件名 path:path.resolve(__dirname,"./dist") // 這里需指定一個(gè)絕對(duì)路徑 我們需要node的path模塊去解析路徑 }, module: { rules: [] // 包含一系列的規(guī)則 } }
plugin
plugin是一個(gè)具有 apply 屬性的 JavaScript 對(duì)象。apply 屬性會(huì)被 webpack compiler 調(diào)用,并且 compiler 對(duì)象可在整個(gè)編譯生命周期訪問(wèn)。
// 代碼省略 module: { rules: [ ] //包含一系列規(guī)則 }, plugins: [ // new PluginName 去生成js對(duì)象供給 webpack compiler 調(diào)用 ]
本地開(kāi)發(fā)配置服務(wù)
yarn add webpack-dev-server -D
本地開(kāi)發(fā)需要安裝webpack-dev-server 內(nèi)部是基于express 實(shí)現(xiàn)的一個(gè)服務(wù) ,可讓讓服務(wù)運(yùn)行在本地,開(kāi)發(fā)更方便
安裝完畢在dist目錄下新建一個(gè)index.html 并且引入打包好后的bundle.js
運(yùn)行npx webpack-dev-server
并未顯示index.html 需要在webpack-config.js 配置
plugins: [ // new PluginName 去生成js對(duì)象供給 webpack compiler 調(diào)用 ], devServer:{ contentBase: "./dist", //當(dāng)前服務(wù)以哪個(gè)作為靜態(tài)資源路徑 host:"localhost", // 主機(jī)名 默認(rèn)是localhost port:3000, // 端口配置 open:true, // 是否自動(dòng)打開(kāi)網(wǎng)頁(yè) }
重新運(yùn)行npx webpack-dev-server 自動(dòng)打開(kāi)網(wǎng)頁(yè)并且能正常顯示頁(yè)面
如果覺(jué)得npx 麻煩的話,可以在package.json 配置腳本
"scripts": { "dev": "webpack-dev-server --config webpack.config.js" }樣式文件的處理
注意:為了顯示效果,不用每次手動(dòng)修改html 我們先裝一個(gè)html模板插件
yarn add html-webpack-plugin -D
webpack-config.js 配置
const HtmlWebpackPlugin = require("html-webpack-plugin") //.... plugins: [ // new PluginName 去生成js對(duì)象供給 webpack compiler 調(diào)用 new HtmlWebpackPlugin({ template:"./index.html", // 作為模板的文件 filename:"index.html" //打包生成后的文件 }) ],
進(jìn)入正題:
樣式文件分為css,less scss 之類的 需要各種loader 先以css作為 樣例
需要先安裝 style-loader跟css-loader
css的處理
yarn add style-loader css-loader -D
webpack.config.js 配置
// 代碼省略 module: { rules: [ { test:/.css$/, use:["style-loader","css-loader"] } ] },
rules 里放的是一個(gè)個(gè)規(guī)則對(duì)象, test是匹配到的文件 loader是從下往上執(zhí)行, 從右往左執(zhí)行, 也就是說(shuō)命中css結(jié)尾的文件后 先用css-loader去解析,解析完畢后交由style-loader 插入到html模板里
此處use內(nèi)部 有2種寫(xiě)法
loader:["style-loader","css-loader"] // 字符串寫(xiě)法
loader:["style-loader",{loader:"css-loader",options:{}} 對(duì)象寫(xiě)法 在options里可以配置你需求的參數(shù)
less的處理
需要安裝less less-loader
yarn add less less-loader -D
//webpack-config.js module: { rules: [ { test:/.less$/, use:["style-loader","css-loader","less-loader"] } ] },
sass 配置同理
- 給樣式加前綴 如-webkit- 需要安裝autoprefixer, postcss-loader
yarn add postcss-loader autoprefixer -D
根目錄需要新建postcss.config.js
// postcss.config.js module.exports = { plugins: [ require("autoprefixer") ] }
webpack-config.js rules: [ { test: /.less$/, use: [ "style-loader", "css-loader", "less-loader" ] } ]
提取樣式文件
yarn add mini-css-extract-plugin -D
//config.js const MiniCssExtractPlugin = require("mini-css-extract-plugin") // 注意MiniCssExtractPlugin 不能在development環(huán)境中使用 ??! //.... mode:"production", // 指定生產(chǎn)還是開(kāi)發(fā) module: { rules: [ { test: /.less$/, use: [ MiniCssExtractPlugin.loader, "css-loader", "less-loader" ] } ] }, plugins: [ // new PluginName 去生成js對(duì)象供給 webpack compiler 調(diào)用 new HtmlWebpackPlugin({ template:"./index.html", filename:"index.html" }), new MiniCssExtractPlugin({ filename: "[name].css", chunkFilename: "[id].css" }) ] //...
- 壓縮提取出來(lái)的樣式文件
需要用到uglifyjs-webpack-plugin,optimize-css-assets-webpack-plugin
yarn add optimize-css-assets-webpack-plugin uglifyjs-webpack-plugin -D
//webpack-config.js module.exports = { //... optimization: { // 優(yōu)化項(xiàng) 這里OptimizeCSSAssetsPlugin 需要UglifyJsPlugin minimizer: [ new UglifyJsPlugin({ cache: true, parallel: true, sourceMap: true // set to true if you want JS source maps }), new OptimizeCSSAssetsPlugin({}) ] }, }js文件的處理
這里自然輪到我們的babel出場(chǎng)啦 把es6解析為es5 需要這幾個(gè)loader
yarn add babel-loader @babel/core @babel/preset-env -D
{ test:/.js/, use:{ loader:"babel-loader", options:{ presets:[ "@babel/preset-env" ] } } },
es7的語(yǔ)法類似
class Parent{ }
這種需要@babel/plugin-proposal-class-properties
yarn add @babel/plugin-proposal-class-properties -D
另外裝飾器方面需要
yarn add @babel/plugin-proposal-decorators -D
{ test:/.js/, use:{ loader:"babel-loader", options:{ presets:[ "@babel/preset-env" ], plugins: [ ["@babel/plugin-proposal-decorators", { "legacy": true }], ["@babel/plugin-proposal-class-properties", { "loose" : true }] ] } } },
像一些js內(nèi)置的api 比如生成器 這種需要
yarn add @babel/plugin-transform-runtime -D
exclude:/node_modules // 必須配置 不然會(huì)解析到node_modules 里的js //.... plugins: [ ["@babel/plugin-proposal-decorators", { "legacy": true }], ["@babel/plugin-proposal-class-properties", { "loose" : true },"@babel/plugin-transform-runtime"] ]
還有一些es7 實(shí)例上的某些方法 。字符串的include 這些也要轉(zhuǎn)換
yarn add @babel/polyfill -D
需要添加到entry上或者在入口文件導(dǎo)入
全局變量的引入問(wèn)題
有時(shí)候我們不想在每個(gè)模塊都導(dǎo)入某個(gè)庫(kù)或者插件 只需要這樣配置
plugins: [ // new PluginName 去生成js對(duì)象供給 webpack compiler 調(diào)用 new webpack.ProvidePlugin({ // 自動(dòng)在每個(gè)模塊內(nèi)先導(dǎo)入了React React:"react" }), ],靜態(tài)資源的處理
yarn add file-loader url-loader -D
{ test: /.png|jpg|gif$/, use: { loader:"url-loader", options:{ limit:2048 // 小于2k 的會(huì)用url-loader轉(zhuǎn)為base64 否則file-loader轉(zhuǎn)為真實(shí)img outputPath:"static/image/" //指定輸出目錄 }, } },
預(yù)告: 多頁(yè)面配置 跨域 區(qū)分不同環(huán)境 映射
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/102072.html
摘要:多頁(yè)面配置進(jìn)擊基礎(chǔ)篇一進(jìn)擊基礎(chǔ)篇二配置多頁(yè)面配置多頁(yè)面配置即是多入口需要寫(xiě)成對(duì)象形式,注意數(shù)組形式會(huì)變成多入口單頁(yè)面,因?yàn)榇虬蟮臅?huì)合并成一個(gè)入口文件出口不能寫(xiě)同一個(gè)文件用代替以上配置并不能多頁(yè)面,還需要個(gè)模板,并且指明各自的代碼塊去生成 多頁(yè)面配置 進(jìn)擊webpack 4 (基礎(chǔ)篇一) 進(jìn)擊webpack4 (基礎(chǔ)篇二:配置) ## 多頁(yè)面配置 ## 多頁(yè)面配置即是多入口 entr...
摘要:進(jìn)擊基礎(chǔ)篇一進(jìn)擊基礎(chǔ)篇二配置一進(jìn)擊基礎(chǔ)篇三配置二不解析不依賴第三方模塊的模塊有一些第三方模塊,它本身不依賴于其他模塊,比如,,不去編譯這些庫(kù),會(huì)使得打包更加快速是個(gè)正則或者包含正則的數(shù)組不去解析忽略 進(jìn)擊webpack 4 (基礎(chǔ)篇一)進(jìn)擊webpack4 (基礎(chǔ)篇二:配置 一)進(jìn)擊webpack4 (基礎(chǔ)篇三:配置 二) 不解析不依賴第三方模塊的模塊 noParse 有一些第三方模塊...
摘要:主題本文為的基礎(chǔ)部分,旨在如何從搭建一個(gè)工程環(huán)境,并簡(jiǎn)單介紹打包之后生成什么代碼,并且介紹的常用的各種,的配置跟解決了什么問(wèn)題本篇為第一篇項(xiàng)目初始化安裝個(gè)人比較喜歡用初始化項(xiàng)目完成后再在目錄里新建一個(gè)文件用于放我們的源代碼,創(chuàng)建一個(gè)作 主題 本文為webpack的基礎(chǔ)部分, 旨在如何從0搭建一個(gè)工程環(huán)境,并簡(jiǎn)單介紹打包之后生成什么代碼, 并且介紹webpack的常用的各種loader,...
摘要:五六月份推薦集合查看最新的請(qǐng)點(diǎn)擊集前端最近很火的框架資源定時(shí)更新,歡迎一下。蘇幕遮燎沈香宋周邦彥燎沈香,消溽暑。鳥(niǎo)雀呼晴,侵曉窺檐語(yǔ)。葉上初陽(yáng)乾宿雨,水面清圓,一一風(fēng)荷舉。家住吳門,久作長(zhǎng)安旅。五月漁郎相憶否。小楫輕舟,夢(mèng)入芙蓉浦。 五、六月份推薦集合 查看github最新的Vue weekly;請(qǐng)::點(diǎn)擊::集web前端最近很火的vue2框架資源;定時(shí)更新,歡迎 Star 一下。 蘇...
閱讀 1064·2021-11-24 09:39
閱讀 3602·2021-11-22 13:54
閱讀 2558·2021-10-11 10:59
閱讀 797·2021-09-02 15:40
閱讀 1036·2019-08-30 15:55
閱讀 1054·2019-08-30 13:57
閱讀 2314·2019-08-30 13:17
閱讀 3034·2019-08-29 18:32