vue-cli + webpack 多頁面配置分析
vue-cli + webpack 多頁面例項應用
<div class="postBody">
<div id="cnblogs_post_body" class="blogpost-body"><h2>關於vue.js</h2>
vue.js是一套構建使用者介面的 輕型的漸進式前端框架。它的目標是通過儘可能簡單的 API 實現響應的資料繫結和組合的檢視元件。使用vue可以給你的開發帶來極致的程式設計體驗。
關於vue-cli
Vue-cli是vue官方提供的一個命令列工具(vue-cli),可用於快速搭建大型單頁應用。該工具提供開箱即用的構建工具配置,帶來現代化的前端開發流程。只需一分鐘即可啟動帶熱過載、儲存時靜態檢查以及可用於生產環境的構建配置的專案。
疑問
vue-cli主要是用於構建單頁應用的腳手架,但是現實專案中,大部分專案都是多頁的,怎麼樣可以很好的利用這一套官方配置呢?我在網上找了一下, 幾乎找不到vue多頁應用例項,所以才有基於vue-cli生成的單頁應用進行改造。
程式碼地址:
Github:https://github.com/breezefeng/vue-cli-multipage,大家要是覺得好用就給一個star支援下吧~
使用方法
# install dependencies
npm install
# serve
with hot reload at localhost:8080/module/
index.html npm run dev 目錄結構
vue-cli-multipage |---build |---config |---src |---assets |---img 圖片檔案 |---css 樣式檔案 |---font 字型檔案 |---components 元件 |---Button.vue 按鈕元件 |---Hello.vue |---module|---index 首頁模組 |---index.html |---index.js |---App.vue |---detail 詳情頁模組 |---detail.html |---detail.js |---App.vue
從目錄結構上,各種元件、頁面模組、資源等都按類新建了資料夾,方便我們儲存檔案。
其實我們所有的檔案,最主要都是放在module資料夾裡,以資料夾名為html的名稱。
例如:
|---index 首頁模組 |---index.html |---index.js |---App.vue
此時我們訪問的連結是:
http://localhost:8080/module/index.html
這裡一定要注意,在module裡下級資料夾裡需要將html,js,vue template 都統一放在當前資料夾裡,當然你也可以繼續放其他的資源,例如css、圖片、元件等,webpack會打包到當前頁面裡。
如果專案不需要這個頁面了,可以把這個資料夾直接刪除掉,乾淨利落,幹活也開心。
像以前傳統的開發專案,所有的圖片都習慣放在images裡,當專案有改動時,有些圖片等資源用不上了,但還佔著坑位,導致專案越來越大,雖然現在的硬體容量大到驚人,但我們應該還是要養到一個良好的習慣。
元件的使用
元件(Component)是 vue.js 最強大的功能之一,當你發現使用元件可以減少造輪子裡,你會深深的愛上它。
我們的元件都是放在components目錄下的,呼叫元件的方法也很簡單。
import Hello from 'components/Hello'
然後記得在*.vue註冊匯入的元件,要不然會無法使用。
import Hello from 'components/Hello' export default { name: 'app', components: { //在這裡註冊元件,不然無法使用 Hello } }
構建程式碼說明
那我們使用的是vue-cli的手腳架,用過vue-cli的同學都知道構建程式碼是放在根目錄build下,vue多頁面主要修改了這三個JS檔案:webpack.base.conf.js、webpack.dev.conf.js、webpack.prod.conf.js。
/** ** [webpack.base.conf.js]這裡主要列出相關程式碼的修改點,具體程式碼請看build/webpack.base.conf.js */ var entries = getEntry('./src/module/**/*.js'); // 獲得入口js檔案 module.exports = { entry: entries, .... } function getEntry(globPath) { var entries = {}, basename, tmp, pathname; glob.sync(globPath).forEach(function (entry) { basename = path.basename(entry, path.extname(entry)); tmp = entry.split('/').splice(-3); pathname = tmp.splice(0, 1) + '/' + basename; // 正確輸出js和html的路徑 entries[pathname] = entry; }); return entries; }
/** ** [webpack.prod.conf.js]這裡主要列出相關程式碼的修改點,具體程式碼請看build/webpack.base.prod.js */ function getEntry(globPath) { var entries = {}, basename, tmp, pathname; glob.sync(globPath).forEach(function (entry) { basename = path.basename(entry, path.extname(entry)); tmp = entry.split('/').splice(-3); pathname = tmp.splice(0, 1) + '/' + basename; // 正確輸出js和html的路徑 entries[pathname] = entry; }); return entries; } var pages = getEntry('./src/module/**/*.html'); for (var pathname in pages) { // 配置生成的html檔案,定義路徑等 var conf = { filename: pathname + '.html', template: pages[pathname], // 模板路徑 inject: true, // js插入位置 minify: { //removeComments: true, //collapseWhitespace: true, //removeAttributeQuotes: true }, // necessary to consistently work with multiple chunks via CommonsChunkPlugin chunksSortMode: 'dependency' }; if (pathname in module.exports.entry) { conf.chunks = ['manifest', 'vendor', pathname]; conf.hash = true; } module.exports.plugins.push(new HtmlWebpackPlugin(conf)); }
修改的程式碼不是很多,但是卻為多頁應用提供了強大的構建支援。歡迎大家使用,也希望大家多多交流。