vue-cli + webpack 多頁面實例應用

關於vue.js

vue.js是一套構建用戶界面的 輕型的漸進式前端框架。它的目標是經過儘量簡單的 API 實現響應的數據綁定和組合的視圖組件。使用vue能夠給你的開發帶來極致的編程體驗。css

關於vue-cli

Vue-cli是vue官方提供的一個命令行工具(vue-cli),可用於快速搭建大型單頁應用。該工具提供開箱即用的構建工具配置,帶來現代化的前端開發流程。只需一分鐘便可啓動帶熱重載、保存時靜態檢查以及可用於生產環境的構建配置的項目。html

疑問

vue-cli主要是用於構建單頁應用的腳手架,可是現實項目中,大部分項目都是多頁的,怎麼樣能夠很好的利用這一套官方配置呢?我在網上找了一下, 幾乎找不到vue多頁應用實例,因此纔有基於vue-cli生成的單頁應用進行改造。前端

代碼地址:

Github:https://github.com/breezefeng/vue-cli-multipage,你們要是以爲好用就給一個star支持下吧~vue

使用方法

複製代碼
# install dependencies
npm install

# serve with hot reload at localhost:8080/module/index.html
npm run dev

# build for production with minification
npm run build
複製代碼

目錄結構

複製代碼
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
複製代碼

從目錄結構上,各類組件、頁面模塊、資源等都按類新建了文件夾,方便咱們儲存文件。webpack

其實咱們全部的文件,最主要都是放在module文件夾裏,以文件夾名爲html的名稱。git

例如:github

複製代碼
|---index  首頁模塊
  |---index.html
  |---index.js
  |---App.vue
複製代碼

此時咱們訪問的連接是:web

http://localhost:8080/module/index.html

這裏必定要注意,在module裏下級文件夾裏須要將html,js,vue template 都統一放在當前文件夾裏,固然你也能夠繼續放其餘的資源,例如css、圖片、組件等,webpack會打包到當前頁面裏。vue-cli

若是項目不須要這個頁面了,能夠把這個文件夾直接刪除掉,乾淨利落,幹活也開心。npm

像之前傳統的開發項目,全部的圖片都習慣放在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));
}
複製代碼

 修改的代碼不是不少,可是卻爲多頁應用提供了強大的構建支持。歡迎你們使用,也但願你們多多交流

參考: 
https://github.com/Coffcer/Blog/issues/1 
http://cnu4.github.io/2016/03/21/Webpack-Vue-MultiplePage/ 
http://jiongks.name/blog/just-vue/?from=groupmessage&isappinstalled=1 
http://www.cnblogs.com/grimm/p/5768433.html 
https://github.com/yaoyao1987/vue-cli-multipage

相關文章
相關標籤/搜索