{{vue}}
摘要:前言最近在研究使用的使用在查閱了數篇文章后學習了的基礎打包流程本來就可以一刪了之了但是覺得未免有點可惜所以就有了這篇文章供大家參考打包的教程具有時效性有不少作者在一直維護一篇文章超過一定時間參考價值就會下降希望各位了解這一點使用的依賴一覽
前言
最近在研究使用webpack的使用,在查閱了數篇文章后,學習了webpack的基礎打包流程.
本來就可以一刪了之了,但是覺得未免有點可惜,所以就有了這篇文章,供大家參考.
webpack打包的教程具有時效性,有不少作者在一直維護一篇文章.超過一定時間參考價值就會下降,希望各位了解這一點.
使用的依賴一覽"devDependencies": { "clean-webpack-plugin": "^0.1.19", "css-loader": "^1.0.0", "html-webpack-plugin": "^3.2.0", "mini-css-extract-plugin": "^0.4.3", "vue-loader": "^15.4.2", "vue-style-loader": "^4.1.2", "vue-template-compiler": "^2.5.17", "webpack": "^4.19.1", "webpack-cli": "^3.1.0", "webpack-merge": "^4.1.4" }, "dependencies": { "vue": "^2.5.17" }
都是目前最新的穩定版本.
講解到的內容webpack的安裝
webpack簡單配置
vue的安裝以及使用
使用插件
提取css
使用多個配置文件
簡單的代碼分離
構建目錄我們創建一個新的目錄(learnwebpack).在下面創建src文件夾和一個index.html.
然后我們使用npm init命令初始化一個package.json文件,直接一路回車過去就好了.
目錄結構:
learnwebpack
src
index.html
package.json
src保存我們未經編譯的源碼.
index.html內容如下:
安裝webpackWebpack4 && Vue
在webpack4中不僅僅需要安裝webpack本身,還需要安裝webpack-cli.
npm install webpack webpack-cli --save-dev
使用--save-dev參數會將這兩個包添加到package.json的開發依賴中.
webpack4的特性在webpack4中可以實現0配置打包,也就是說不需要任何設置就可以完成簡單的打包操作.
此外最實用的特性之一就是mode配置選項用于告訴webpack輸出模式是開發還是產品,提供了已經預先定義好的常用配置.
后面的例子中我們會使用到mode.
webpack的簡單配置我們在當前目錄下新建一個webpack的配置文件webpack.config.js.
此時的目錄結構為:
learnwebpack
src
index.html
webpack.config.js
package.json
webpack.config.js的內容:
const {join:pathJoin} = require("path"); module.exports = { entry:{ app:"./src/index.js" // 入口文件的位置 }, output:{ filename:"[name].bundle.js", // 輸出文件名字的格式 path:pathJoin(__dirname,"./dist") // 輸出的絕對路徑 }, }為什么會有filename上的格式
對于我們當前的應用來說好像沒有任何用途,打包后文件名完全可以和入口一樣.
使用不同的文件名可以解決相同文件名稱導致的瀏覽器緩存問題.
對于我們當前這個格式來說,打包后的文件名稱為app.bundle.js.
此外還有一些額外的模板符號:
[hash] 模塊標識符(module identifier)的 hash
[chunkhash] chunk 內容的 hash
[name] 模塊名稱
[id] 模塊標識符(module identifier)
[query] 模塊的 query,例如,文件名 ? 后面的字符串
現在讓我們在src文件夾下新建一個index.js,只寫一行簡單的代碼用于測試:
console.log("hello world!");
此時的目錄結構為:
learnwebpack
src
index.js
index.html
webpack.config.js
package.json
為什么使用index.jswebpack4中零配置的默認入口位置就是當前配置路徑下的./src/index.js,也就是說如果不指定入口的情況下也是可以打包的.
構建我們的項目運行:
./node_modules/.bin/webpack-cli --config webpack.config.js
上方的命令有點冗長,我們使用package.json中scripts字段來定義一個快捷方式.
package.json:
{ +++ "scripts": { "build": "webpack --config webpack.config.js" } +++ }
+++ 表示package.json的其他字段,這部分目前不用關心.
現在運行這條簡化的命令,效果和上方一樣.
npm run build
對于npm版本高于5.2.0的同學可以嘗試使用npm的附帶模塊npx.
npx可以直接運行./node_modules/.bin/下的內容而不必輸入路徑.
npx webpack --config webpack.config.js
如果操作正確你的目錄下應該會多出一個dist文件夾,內部有一個app.bundle.js文件.
此時的目錄結構:
learnwebpack
dist
app.bundle.js
src
index.js
index.html
webpack.config.js
package.json
我們可以運行index.html了,如果一切順利.那么在控制臺中應該會出現hello world!.
錯誤當我們打包的時候webpack4會報錯,原因就是我們沒有指定上文中提到的mode屬性,webpack默認將他設置為production.
此時如果你查看代碼,就會發現代碼是經過壓縮的,這是webpack4的默認行為之一.
WARNING in configuration The "mode" option has not been set, webpack will fallback to "production" for this value. Set "mode" option to "development" or "production" to enable defaults for each environment. You can also set it to "none" to disable any default behavior. Learn more: https://webpack.js.org/concepts/mode/安裝Vue
使用npm安裝:
npm -i vue
vue是運行時依賴,webpack需要合適loader將vue文件解釋為webpack可以理解的格式用于構建,所以我們需要vue-loader來轉換vue單文件.
使用npm安裝vue-loader:
npm install vue-loader --save-dev
vue單文件中分為三個部分,其中template部分需要專用的插件進行轉換.
安裝vue-template-compiler:
npm install vue-template-compiler --save-dev
這個使用vue-loader自動調用的插件,也是官方默認的,不需要任何配置.
如果你不使用他,打包的時候會報錯.
簡單來說他的功能是將template部分的模板轉為render函數.
然后我們需要處理css,vue-loader需要css-loader才可以運行.
安裝css-loader:
npm install css-loader --save-dev
css-loader的作用僅僅是將css轉為webpack可以解釋的類型,如果我們需要將樣式使用起來插入到html中,必須使用額外的插件.
安裝vue-style-loader:
npm install vue-style-loader --save-dev
vue-style-loader是由vue官方維護的你也可以使用其他的loader來處理css,他除了提供了常見的插入樣式到html的功能以外還提供了其他的功能,例如熱更新樣式等.
修改配置webpack.config.js:
const {join:pathJoin} = require("path"); const VueLoaderPlugin = require("vue-loader/lib/plugin"); // +++ module.exports = { mode:"production", entry:{ app:"./src/index.js" }, output:{ filename:"[name].bundle.js", path:pathJoin(__dirname,"./dist") }, module: { rules: [ { test: /.vue$/, use: ["vue-loader"] // +++ }, { test: /.css$/, use: ["vue-style-loader","css-loader"] // +++ } ] }, plugins:[ new VueLoaderPlugin() // +++ ] }
需要注意的是VueLoaderPlugin在vue-loaderv15的版本中,這個插件是必須啟用的.
修改目錄結構以及文件我們在src下創建一個pages文件夾并且在內部創建一個app.vue文件.
此時的目錄結構:
learnwebpack
dist
app.bundle.js
src
pages
app.vue
index.js
index.html
webpack.config.js
package.json
app.vue文件內容:
{{vue}}
app.vue是由index.js引用的,回過頭來我們修改index.js:
import Vue from "vue" import App from "./pages/app.vue"; new Vue({ el:"#root", render:h=>h(App) })
激動人心的時候到了,如果一切順利你的vue應用應該打包完成了,運行index.html就可以查看這個結果了.
使用插件回顧前面的一個話題,指定輸出文件名字格式.如果你將我們的內容放到一個服務器上運行,你會很容易發現一個問題.
就是緩存,web上的資源瀏覽器會對其進行緩存,但是對開發的時候,或者產品中的代碼更新十分不友好,新的代碼不會得到及時的使用.
我們讓資源每次的名字不一樣就可以簡單的解決這個問題,接下來修改我們的webpack.config.js:
const {join:pathJoin} = require("path"); const VueLoaderPlugin = require("vue-loader/lib/plugin"); module.exports = { +++ output:{ filename:"[name].[hash].js", path:pathJoin(__dirname,"./dist") }, +++ }
此時再次修改代碼打包每次的名字都不會一樣.
但是出現了另外一個問題由于資源名字每次都不一致,每次我都需要手動指定index.html中引用的資源,這個時候該html-webpack-plugin出場了.
這個插件可以自動生成一個html文件,并且將資源文件按照正確順序插入到html中.
安裝html-webpack-plugin:
npm install html-webpack-plugin --save-dev
webpack.config.js添加配置
const {join:pathJoin} = require("path"); const VueLoaderPlugin = require("vue-loader/lib/plugin"); const HtmlWebpackPlugin = require("html-webpack-plugin"); module.exports = { entry:{ app:"./src/index.js" }, output:{ filename:"[name].[hash]].js", path:pathJoin(__dirname,"./dist") }, module: { rules: [ { test: /.vue$/, use: ["vue-loader"] }, { test: /.css$/, use: ["vue-style-loader","css-loader"] } ] }, plugins:[ new HtmlWebpackPlugin({ template:"template.html",// 指定模板html文件 filename:"index.html"http:// 輸出的html文件名稱 }), new VueLoaderPlugin() ] }
然后我們把index.html重命名為template.html,將template.html中的script標簽刪除.
指定模板后HtmlWebpackPlugin會保留原來html中的內容,而且會在新生成的html文件中把script插入到合適的位置.
HtmlWebpackPlugin補充注意:HtmlWebpackPlugin必須位于插件數組的首位.
運行項目你會發現在dist目錄下會有index.html文件,而我們打包后的index.js的輸出文件名也變成了app.XXXXXXXXXXXXXXXX.js的格式,更加神奇的是在index.html中自動插入了script標簽來引用打包后的js文件.
使用CleanWebpackPlugin插件當你多次打包的時候,你會發現由于使用hash來命名輸出的文件每次的文件名稱都不一樣,導致文件越來越多.
使用CleanWebpackPlugin可以每次構建前清空輸出目錄.
安裝:
npm install clean-webpack-plugin --save-dev
webpack.config.js:
const {join:pathJoin} = require("path"); const VueLoaderPlugin = require("vue-loader/lib/plugin"); const HtmlWebpackPlugin = require("html-webpack-plugin"); const CleanWebpackPlugin = require("clean-webpack-plugin");// +++ module.exports = { entry:{ app:"./src/index.js" }, output:{ filename:"[name].[hash]].js", path:pathJoin(__dirname,"./dist") }, module: { rules: [ { test: /.vue$/, use: ["vue-loader"] }, { test: /.css$/, use: ["vue-style-loader","css-loader"] } ] }, plugins:[ new HtmlWebpackPlugin({ template:"template.html", filename:"index.html" }), new VueLoaderPlugin(), new CleanWebpackPlugin(["dist"])// +++ 運行前刪除dist目錄 ] }
現在無論運行幾次構建dist目錄下都是干凈的.
提取css現在我們來將vue單文件中的css提取出來到一個多帶帶的css文件中.
webpack4中完成這個功能的插件是mini-css-extract-plugin.
安裝:
npm install mini-css-extract-plugin --save-dev
webpack.config.js:
const {join:pathJoin} = require("path"); const VueLoaderPlugin = require("vue-loader/lib/plugin"); const HtmlWebpackPlugin = require("html-webpack-plugin"); const CleanWebpackPlugin = require("clean-webpack-plugin"); const MiniCssExtractPlugin = require("mini-css-extract-plugin");// +++ module.exports = { entry:{ app:"./src/index.js" }, output:{ filename:"[name].[hash]].js", path:pathJoin(__dirname,"./dist") }, module: { rules: [ { test: /.vue$/, use: ["vue-loader"] }, { test: /.css$/, use: [ { loader:MiniCssExtractPlugin.loader // +++ }, "css-loader" ] } ] }, plugins:[ new HtmlWebpackPlugin({ template:"template.html", filename:"index.html" }), new MiniCssExtractPlugin({ filename:"style.css" // 指定輸出的css文件名. }), new VueLoaderPlugin(), new CleanWebpackPlugin(["dist"]) ] }
運行我們的項目,現在dist目錄下已經有一個style.css的文件了,而且htmlwebpackplugin自動將style.css插入到了index.html中.
使用多個配置考慮以下問題:
開發的時候我們希望打包速度快,有源代碼提示,有熱重載(本篇文章沒有涉獵)...
發布產品我們希望輸出的內容不會被緩存,有代碼壓縮...
是時候使用多個配置了,一個用于開發一個用于生產.
但是我們還可以做的更好使用webpack-merge插件,可以將多個配置合成.
安裝webpack-merge:
npm install webpack-merge --save-dev
首先我們定義一個包含基本信息的webpack配置文件,這個文件被其他配置文件依賴.
webpack.common.js:
const {join:pathJoin} = require("path"); const CleanWebpackPlugin = require("clean-webpack-plugin"); const VueLoaderPlugin = require("vue-loader/lib/plugin"); const HtmlWebpackPlugin = require("html-webpack-plugin"); module.exports = { entry:{ app:"./src/index.js" }, output:{ filename:"[name].[hash].js", path:pathJoin(__dirname,"./dist") }, plugins:[ new HtmlWebpackPlugin({ template:"template.html", filename:"index.html" }), new VueLoaderPlugin(), new CleanWebpackPlugin(["dist"]) ] }
可以看到這里定義的都是最基本的信息.
然后我們定義開發配置并且在內容使用webpack-merge插件和webpack.config.js進行合并.
webpack.dev.js:
const merge = require("webpack-merge"); const common = require("./webpack.common.js"); module.exports = merge(common, { mode: "development", // 不壓縮代碼,加快編譯速度 devtool: "source-map", // 提供源碼映射文件調試使用 module: { rules: [ { test: /.vue$/, use: ["vue-loader"] }, { test: /.css$/, use: ["vue-style-loader","css-loader"] // 使用vue-style-loader直接插入到style標簽中 } ] }, })
定義生產配置.
webpack.prod.js:
const merge = require("webpack-merge"); const common = require("./webpack.common.js"); const MiniCssExtractPlugin = require("mini-css-extract-plugin") module.exports = merge(common,{ mode:"production", // 壓縮代碼 module: { rules: [ { test: /.vue$/, use: ["vue-loader"] }, { test: /.css$/, use: [ { loader:MiniCssExtractPlugin.loader // 提取css到外部文件中 }, "css-loader" ] } ] }, plugins:[ new MiniCssExtractPlugin({ filename:"style.css" }) ] })
最后修改一下我們package.json中的快捷方式:
+++ "scripts": { "dev": "webpack --config webpack.dev.js", "build": "webpack --config webpack.prod.js" }, +++
刪除之前的webpack.config.js.
完成后的目錄結構:
learnwebpack
dist
src
pages
app.vue
index.js
package.json
template.html
webpack.common.js
webpack.dev.js
webpack.prod.js
嘗試運行npm run dev和npm run build吧.
簡單的代碼分離我們在index.js中引用了Vue,如果你查看打包后的代碼你會發現vue本身會被打包到同一個文件中,如果我們有另外一個文件也引用了vue同樣的會被打包到該文件中.
顯然我們的代碼依賴vue,但是vue不應該存在兩份,如果可以將vue多帶帶提取出來就好了,這個問題就是要代碼分離.
在webpack4中刪除了原來的CommonsChunkPlugin插件,內部集成的optimization.splitChunks選項可以直接進行代碼分離.
修改webpack.dev.js:
const merge = require("webpack-merge"); const common = require("./webpack.common.js"); module.exports = merge(common, { mode: "development", devtool: "source-map", optimization:{ // +++ splitChunks:{ // +++ chunks:"initial" // +++ initial(初始塊)、async(按需加載塊)、all(全部塊) } }, module: { rules: [ { test: /.vue$/, use: ["vue-loader"] }, { test: /.css$/, use: ["vue-style-loader","css-loader"] } ] }, })
我們要做的就是將打包后寫入到index.html的文件從目前的一個文件拆分成多個,并且寫入到index.html中.
也就是說在入口處分離代碼.
運行:
npm run dev
你會發現在dist目錄下多出了一個文件保存著vue,另外一個文件中保存著我們編寫的代碼.
參考vue部分:
https://cn.vuejs.org/v2/guide...
https://vue-loader.vuejs.org/zh/
https://www.npmjs.com/package...
webpack部分:
https://webpack.docschina.org...
https://github.com/webpack-co...
https://github.com/jantimon/h...
參考的其他教程:
https://segmentfault.com/a/11...
https://segmentfault.com/a/11...
http://www.cnblogs.com/anani/...
https://blog.csdn.net/bubblin...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/108557.html
摘要:后來經過排查你會發現是由于目前還沒有版本。可以使用該方式解決。這就是我為什么不推薦你使用創建腳手架的原因此文的受眾是想要進階中級的初級前端人員。 最近在知乎看到一個問題,原問題如下: 很奇怪,為什么現在能找到自己手動創建vue腳手架的文章非常少,而且大家似乎對webpack4的熱情并不高,對于想基于vue2.0+webpack4搭建一個腳手架的我來說資料真是少得可憐。難道現在一般的做...
摘要:五六月份推薦集合查看最新的請點擊集前端最近很火的框架資源定時更新,歡迎一下。蘇幕遮燎沈香宋周邦彥燎沈香,消溽暑。鳥雀呼晴,侵曉窺檐語。葉上初陽乾宿雨,水面清圓,一一風荷舉。家住吳門,久作長安旅。五月漁郎相憶否。小楫輕舟,夢入芙蓉浦。 五、六月份推薦集合 查看github最新的Vue weekly;請::點擊::集web前端最近很火的vue2框架資源;定時更新,歡迎 Star 一下。 蘇...
摘要:五六月份推薦集合查看最新的請點擊集前端最近很火的框架資源定時更新,歡迎一下。蘇幕遮燎沈香宋周邦彥燎沈香,消溽暑。鳥雀呼晴,侵曉窺檐語。葉上初陽乾宿雨,水面清圓,一一風荷舉。家住吳門,久作長安旅。五月漁郎相憶否。小楫輕舟,夢入芙蓉浦。 五、六月份推薦集合 查看github最新的Vue weekly;請::點擊::集web前端最近很火的vue2框架資源;定時更新,歡迎 Star 一下。 蘇...
摘要:根據依賴關系,按照配置文件把模塊函數分組打包成若干個。會隨著自身的的修改,而發生變化。只需要在命令行運行時帶上參數就搞定一些插件的廢除和替換廢棄了頂替者用屬性變化壓縮優化代碼分割,下面詳解還有一些新的插件,。 1. 前端工程化項目打包歷史 前端工程化之前的時代略過 1. 半自動執行腳本來壓縮合并文件 自從xmlhttprequest被挖掘出來,網頁能夠和服務端通訊,js能做的事越來越多...
閱讀 1630·2023-04-25 18:19
閱讀 2078·2021-10-26 09:48
閱讀 1079·2021-10-09 09:44
閱讀 1731·2021-09-09 11:35
閱讀 3027·2019-08-30 15:54
閱讀 2021·2019-08-30 11:26
閱讀 2285·2019-08-29 17:06
閱讀 884·2019-08-29 16:38