詳解基于webpack2.x的vue2.x的多頁(yè)面站點(diǎn)
本文介紹了基于webpack2.x的vue2.x的多頁(yè)面站點(diǎn),分享給大家,具體如下:
vue的多頁(yè)面
依舊使用vue-cli
來(lái)初始化我們的項(xiàng)目
然后修改主要目錄結(jié)構(gòu)如下:
├── build │ ├── build.js │ ├── check-versions.js │ ├── dev-client.js │ ├── dev-server.js │ ├── utils.js │ ├── vue-loader.conf.js │ ├── webpack.base.conf.js │ ├── webpack.dev.conf.js │ └── webpack.prod.conf.js ├── src │ ├── pages │ │ ├── boys │ │ │ ├── index.html │ │ │ ├── index.js │ │ │ └── index.vue │ │ ├── goods │ │ │ ├── index.html │ │ │ ├── index.js │ │ │ └── index.vue │ │ ├── index │ │ │ ├── index.html │ │ │ ├── index.js │ │ │ └── index.vue │ │ └── sotho │ │ ├── index.html │ │ ├── index.js │ │ └── index.vue
編寫(xiě)每個(gè)頁(yè)面
可以看到這里我們有4個(gè)單獨(dú)的頁(yè)面,分別是boys,goods,index,sotho
首先看boys文件夾中的代碼:
index.html
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>vue3</title> </head> <body> <div id="app"></div> <!-- built files will be auto injected --> </body> </html>
這個(gè)是我們要單獨(dú)生成的頁(yè)面,最后也是生成index.html
index.vue
<style scoped> .boys { background-color: red; } </style> <template> <div id="app" class="boys"> boys got many things. </div> </template> <script> export default { name: 'boys' } </script>
這是我們的vue文件,可以看成一個(gè)組件,其實(shí).vue
文件你可以看成一個(gè)語(yǔ)法糖,最終會(huì)被vue-loader
編譯成js,生成對(duì)應(yīng)的css,js,dom
index.js
import Vue from 'vue' import Index from './index.vue' Vue.config.productionTip = false new Vue({ el: '#app', template: '<Index/>', components: { Index } })
這就是主要文件了,這里執(zhí)行vue的實(shí)例化,用法同在瀏覽器端頁(yè)面中直接引入vue.js
文件一樣的含義
其他幾個(gè)頁(yè)面一樣也是同理,具體可以見(jiàn):
修改webpack.config.js
由于vue中的配置使用了模塊化管理,所以我們需要修改下面兩個(gè)文件:
1、webpack.base.conf.js
我們需要修改webpack.base.conf.js
的入口entry
,這是配置多入口文件的重點(diǎn)!
如果不懂多入口含義的化,建議去看下webpack的文檔。
webpack.base.conf.js
... module.exports = { entry: { 'pages/boys/index': './src/pages/boys/index.js', //配置boys頁(yè)面入口 'pages/goods/index': './src/pages/goods/index.js', //配置goods頁(yè)面入口 'pages/index/index': './src/pages/index/index.js', //配置index頁(yè)面入口 'pages/sotho/index': './src/pages/sotho/index.js', //配置sotho頁(yè)面入口 }, ...
2、webpack.dev.conf.js
這里我們需要修改plugins,它是個(gè)強(qiáng)大的即插即用的拓展。
我們使用html-webpack-plugin
來(lái)生成我們的對(duì)于的頁(yè)面。
... var HtmlWebpackPlugin = require('html-webpack-plugin') ... ... module.exports = merge(baseWebpackConfig, { ... plugins: [ new webpack.DefinePlugin({ 'process.env': config.dev.env }), new HtmlWebpackPlugin({ filename:'./pages/boys/index.html', //指定生成的html存放路徑 template:'./src/pages/boys/index.html', //指定html模板路徑 inject: true, //是否將js等注入頁(yè)面,以及指定注入的位置'head'或'body' chunks:['pages/boys/index'] //需要引入的chunk(模塊資源),不配置就會(huì)引入所有頁(yè)面的資源(js/css),這是個(gè)很重要的屬性,你可以不配置試試效果 }), new HtmlWebpackPlugin({ filename:'./pages/goods/index.html', template:'./src/pages/goods/index.html', inject: true, chunks:['pages/goods/index'] }), new HtmlWebpackPlugin({ filename:'./pages/index/index.html', template:'./src/pages/index/index.html', inject: true, chunks:['pages/index/index'] }), new HtmlWebpackPlugin({ filename:'./pages/sotho/index.html', template:'./src/pages/sotho/index.html', inject: true, chunks:['pages/sotho/index'] }), ... ] })
以上就是我們進(jìn)行多頁(yè)開(kāi)發(fā)的主要配置項(xiàng)。
開(kāi)發(fā)環(huán)境訪問(wèn)頁(yè)面
運(yùn)行npm run dev
,我們看下怎么訪問(wèn)我們的多頁(yè)vue應(yīng)用。
- http://localhost:9090/pages/index/index.html 訪問(wèn)index頁(yè)面
- http://localhost:9090/pages/boys/index.html 訪問(wèn)boys頁(yè)面
- http://localhost:9090/pages/goods/index.html 訪問(wèn)goods頁(yè)面
- http://localhost:9090/pages/sotho/index.html 訪問(wèn)sotho頁(yè)面
再來(lái)看下我們的dom結(jié)構(gòu)是什么樣:
頁(yè)面里的js就是我們通過(guò)插件注入的,并且我們是通過(guò)指定chunks
完成。
build
運(yùn)行npm run build
➜ vue2-x-multiple git:(master) ✗ npm run build > vue3@1.0.0 build /study/vue2-x-multiple > node build/build.js ⠋ building for production... Starting to optimize CSS... Processing static/css/pages/boys/index.19ebbc80a1c187989dbf02d03192e84e.css... Processing static/css/pages/goods/index.fe8f1bc39f33dce4c4d610c2326482c6.css... Processing static/css/pages/index/index.f6340f14071a89cf2b092da280ffaf8c.css... Processing static/css/pages/sotho/index.7415ffd3ef7b9d1a4398cba49927b12b.css... Processed static/css/pages/boys/index.19ebbc80a1c187989dbf02d03192e84e.css, before: 114, after: 44, ratio: 38.6% Processed static/css/pages/goods/index.fe8f1bc39f33dce4c4d610c2326482c6.css, before: 116, after: 46, ratio: 39.66% Processed static/css/pages/index/index.f6340f14071a89cf2b092da280ffaf8c.css, before: 92, after: 22, ratio: 23.91% Processed static/css/pages/sotho/index.7415ffd3ef7b9d1a4398cba49927b12b.css, before: 92, after: 22, ratio: 23.91% Hash: 2467c91090ccf4690865 Version: webpack 2.5.1 Time: 6319ms Asset Size Chunks Chunk Names static/css/pages/sotho/index.7415ffd3ef7b9d1a4398cba49927b12b.css.map 312 bytes 1 [emitted] pages/sotho/index static/js/vendor.d7548891d04d4f883b29.js 83.2 kB 0 [emitted] vendor static/js/pages/index/index.b2ce74f4155fb942a064.js 671 bytes 2 [emitted] pages/index/index static/js/pages/goods/index.7d0dda2791db2d3b1500.js 702 bytes 3 [emitted] pages/goods/index static/js/pages/boys/index.2c268b75ba9424211d79.js 699 bytes 4 [emitted] pages/boys/index static/js/manifest.f466ccb58b3271558be5.js 1.57 kB 5 [emitted] manifest static/css/pages/boys/index.19ebbc80a1c187989dbf02d03192e84e.css 44 bytes 4 [emitted] pages/boys/index static/css/pages/goods/index.fe8f1bc39f33dce4c4d610c2326482c6.css 46 bytes 3 [emitted] pages/goods/index static/css/pages/index/index.f6340f14071a89cf2b092da280ffaf8c.css 22 bytes 2 [emitted] pages/index/index static/css/pages/sotho/index.7415ffd3ef7b9d1a4398cba49927b12b.css 22 bytes 1 [emitted] pages/sotho/index static/js/vendor.d7548891d04d4f883b29.js.map 687 kB 0 [emitted] vendor static/js/pages/sotho/index.e706490d7c42ad8e4f73.js.map 5.55 kB 1 [emitted] pages/sotho/index static/js/pages/sotho/index.e706490d7c42ad8e4f73.js 674 bytes 1 [emitted] pages/sotho/index static/js/pages/index/index.b2ce74f4155fb942a064.js.map 5.55 kB 2 [emitted] pages/index/index static/css/pages/index/index.f6340f14071a89cf2b092da280ffaf8c.css.map 312 bytes 2 [emitted] pages/index/index static/js/pages/goods/index.7d0dda2791db2d3b1500.js.map 5.64 kB 3 [emitted] pages/goods/index static/css/pages/goods/index.fe8f1bc39f33dce4c4d610c2326482c6.css.map 338 bytes 3 [emitted] pages/goods/index static/js/pages/boys/index.2c268b75ba9424211d79.js.map 5.62 kB 4 [emitted] pages/boys/index static/css/pages/boys/index.19ebbc80a1c187989dbf02d03192e84e.css.map 333 bytes 4 [emitted] pages/boys/index static/js/manifest.f466ccb58b3271558be5.js.map 14.6 kB 5 [emitted] manifest ./pages/boys/index.html 386 bytes [emitted] ./pages/goods/index.html 389 bytes [emitted] ./pages/index/index.html 389 bytes [emitted] ./pages/sotho/index.html 389 bytes [emitted] Build complete. Tip: built files are meant to be served over an HTTP server. Opening index.html over file:// won't work.
進(jìn)入dist目錄,查看生成的頁(yè)面
├── pages │ ├── boys │ │ └── index.html │ ├── goods │ │ └── index.html │ ├── index │ │ └── index.html │ └── sotho │ └── index.html └── static ├── css │ └── pages │ ├── boys │ │ ├── index.19ebbc80a1c187989dbf02d03192e84e.css │ │ └── index.19ebbc80a1c187989dbf02d03192e84e.css.map │ ├── goods │ │ ├── index.fe8f1bc39f33dce4c4d610c2326482c6.css │ │ └── index.fe8f1bc39f33dce4c4d610c2326482c6.css.map │ ├── index │ │ ├── index.f6340f14071a89cf2b092da280ffaf8c.css │ │ └── index.f6340f14071a89cf2b092da280ffaf8c.css.map │ └── sotho │ ├── index.7415ffd3ef7b9d1a4398cba49927b12b.css │ └── index.7415ffd3ef7b9d1a4398cba49927b12b.css.map └── js ├── manifest.f466ccb58b3271558be5.js ├── manifest.f466ccb58b3271558be5.js.map ├── pages │ ├── boys │ │ ├── index.2c268b75ba9424211d79.js │ │ └── index.2c268b75ba9424211d79.js.map │ ├── goods │ │ ├── index.7d0dda2791db2d3b1500.js │ │ └── index.7d0dda2791db2d3b1500.js.map │ ├── index │ │ ├── index.b2ce74f4155fb942a064.js │ │ └── index.b2ce74f4155fb942a064.js.map │ └── sotho │ ├── index.e706490d7c42ad8e4f73.js │ └── index.e706490d7c42ad8e4f73.js.map ├── vendor.d7548891d04d4f883b29.js └── vendor.d7548891d04d4f883b29.js.map
到此為止,一個(gè)簡(jiǎn)單的基于vue2.x的多頁(yè)應(yīng)用完成了。
升級(jí)
webpack.base.conf.js中的entry入口都是手工寫(xiě)入,如果頁(yè)面多的話(huà)這樣肯定有問(wèn)題。
所以我們通過(guò)如下的方式來(lái)自動(dòng)完成這段代碼:
var entryJS = glob.sync('./src/pages/**/*.js').reduce(function (prev, curr) { prev[curr.slice(6, -3)] = curr; return prev; }, {});
這里的 './src/pages/**/*.js'
我們按照一定的規(guī)則去匹配我們的入口j s即可。
生成的的是:
{ 'pages/boys/index': './src/pages/boys/index.js', 'pages/goods/index': './src/pages/goods/index.js', 'pages/index/index': './src/pages/index/index.js', 'pages/sotho/index': './src/pages/sotho/index.js' }
與我們想要的行為一致
同樣我們也升級(jí)下我們的webpack.dev.conf.js中的plugins
var htmls = glob.sync('./src/pages/**/*.html').map(function (item) { return new HtmlWebpackPlugin({ filename: './' + item.slice(6), template: item, inject: true, chunks:[item.slice(2, -5)] }); }); module.exports = merge(baseWebpackConfig, { module: { rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap }) }, // cheap-module-eval-source-map is faster for development devtool: '#cheap-module-eval-source-map', plugins: [ new webpack.DefinePlugin({ 'process.env': config.dev.env }), // https://github.com/glenjamin/webpack-hot-middleware#installation--usage new webpack.HotModuleReplacementPlugin(), new webpack.NoEmitOnErrorsPlugin(), // https://github.com/ampedandwired/html-webpack-plugin new FriendlyErrorsPlugin() ].concat(htmls) })
生成的是:
HtmlWebpackPlugin { options: { template: './src/pages/boys/index.html', filename: './pages/boys/index.html', hash: false, inject: true, compile: true, favicon: false, minify: false, cache: true, showErrors: true, chunks: [ 'pages/boys/index' ], excludeChunks: [], title: 'Webpack App', xhtml: false } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
js分頁(yè)之前端代碼實(shí)現(xiàn)和請(qǐng)求處理
這篇文章主要為大家詳細(xì)介紹了js分頁(yè)之前端代碼實(shí)現(xiàn)和請(qǐng)求處理,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08javascript canvas實(shí)現(xiàn)雨滴效果
這篇文章主要為大家詳細(xì)介紹了javascript canvas實(shí)現(xiàn)雨滴效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06深入理解JavaScript系列(10) JavaScript核心(晉級(jí)高手必讀篇)
本篇是ECMA-262-3 in detail系列的一個(gè)概述(本人后續(xù)會(huì)翻譯整理這些文章到本系列(第11-19章)。每個(gè)章節(jié)都有一個(gè)更詳細(xì)的內(nèi)容鏈接,你可以繼續(xù)讀一下每個(gè)章節(jié)對(duì)應(yīng)的詳細(xì)內(nèi)容鏈接進(jìn)行更深入的了解2012-01-01from 表單提交返回值用post或者是get方法實(shí)現(xiàn)
from 表單提交的返回值可以用jquery的post或者是get方法去實(shí)現(xiàn),具體如下,感興趣的朋友可以參考下,希望對(duì)大家有所幫助2013-08-08js 轉(zhuǎn)json格式的字符串為對(duì)象或數(shù)組(前后臺(tái))的方法
下面小編就為大家?guī)?lái)一篇js 轉(zhuǎn)json格式的字符串為對(duì)象或數(shù)組(前后臺(tái))的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-11-11