前段時間項目組計劃快速開發一個新的App項目,App開發那邊提供殼子和部分系統級功能,全部的頁面由h5完成,考慮兼容性安卓4.1及ios7.1。全新的項目,沒有歷史包袱,就嘗試了新的開發模式,採用了webpack + vue-cli + vue-router + es6 + axios
這一套,從webpack
配置到文件目錄,從開發流程到上線部署,摸索嘗試,到目前初版已經上線。後面會繼續優化,先把目前的基本部署方式記錄下來。javascript
webpack -- ^3.6.0 | vue -- ^2.5.2 | vue-router -- ^3.0.1 | axios -- ^0.17.1
.html
及對應的.js/.css
文件npm run build
以後生成的dist目錄,能夠經過http://m.example.com/index.html
直接訪問到index.html
最終生成的dist目錄相似於:css
disthtml
center/前端
static/vue
js/java
css/node
例:http://m.example.com/index.html
能夠訪問到首頁,http://m.example.com/center/regist.html
則訪問到註冊頁,而http://m.example.com/center/regist.html#agreement
訪問到用戶協議頁webpack
config: 開發相關配置ios
webpack.dev.conf.js
和webpack.dev.prod.js
進行merge覆蓋src: 開發目錄git
base.js/base.css/plugins/images
HtmlWebpackPlugin
的實例,每一個實例都對應一個入口,每一個入口打包出一個頁面vue-router
實現前端路由,統一在此文件夾下定義,會被entry中的入口js引入使用HtmlWebpackPlugin
打包基於的模板頁,多個入口能夠共用一個模板頁。但實際開發中可能某些入口有私有的邏輯,需單首創建模板例:若是咱們想最終生成http://m.example.com/center/regist.html
且含有前端路由的話,須要涉及到的文件有:
1. src/entry/regist.js,以建立入口文件,供`HtmlWebpackPlugin`使用 2. config/webpack.user.conf.js,新建入口,指定入口文件爲`src/entry/regist.js`;新建`HtmlWebpackPlugin`實例,指定打包後生成的文件路徑、文件名及js 3. src/router/regist.js,由於涉及到前端路由,須要配置路由信息 4. page/center/regist.vue、page/center/agreement.vue,進行頁面自身邏輯樣式的開發
默認的webpack配置大致是採用build/webpack.base.js + build/webpack.dev.js/build/webpack.prod.js
merge後的結果,爲了方便實現統一配置,在config下新建了webpack.user.conf.js
,再分別和build/webpack.dev.js/build/webpack.prod.js
merge,所以頁面的配置,基本都在webpack.user.conf.js
進行。
配置項
src/entry/
/src/dist/
,開發環境默認打包後放在內存中,不表明實際物理路徑,output具體配置:output: { path: path.resolve(__dirname, '../dist'), filename: 'static/js/[name].[chunkhash:16].js', chunkFilename: 'static/js/[id].[chunkhash:16].js', publicPath: '/pailifan/' }
plugins: 插件配置
new webpack.optimize.CommonsChunkPlugin({ name: 'vendor', /*在entry中指定vendor對應的模塊爲[vue.js,vue-router.js]*/ filename: 'static/js/vendor.[chunkhash:16].js', minChunks: Infinity })
npm i && npm run dev
src/dist
、src/node_modules
npm i && npm run build
,生產環境不能直接操做dist目錄(npm run build實際會先刪除dist目錄再生成,直接操做會致使發佈時文件404),需先在發佈機生成dist後覆蓋到生產服務器對應的dist目錄npm i && npm run build
,同發佈一致附: vue-cli + es6 + axios項目踩坑
附:webpack.user.conf.js
,會在webpack.base.conf.js
、webpack.dev.conf.js
和webpack.dev.prod.js
進行merge合併
const path = require('path') const fs = require('fs') const webpack = require('webpack') const merge = require('webpack-merge') const HtmlWebpackPlugin = require('html-webpack-plugin') const config = require('../config') const defaultHtmlWebpackConfig = { template: './src/template/index.html' minify: { removeComments: true, collapseWhitespace: true, removeAttributeQuotes: true }, chunksSortMode: 'dependency' } module.exports = { context: path.resolve(__dirname, '../'), output: { path: path.resolve(__dirname, '../dist'), filename: 'static/js/[name].[chunkhash:16].js', chunkFilename: 'static/js/[id].[chunkhash:16].js', publicPath: '/' }, CommonsChunkPlugin: { Dev: [ new webpack.optimize.CommonsChunkPlugin({ name: 'vendor', filename: 'vendor.js', minChunks: Infinity }) ], Prod: [ new webpack.optimize.CommonsChunkPlugin({ name: 'vendor', filename: 'static/js/common/vendor.[chunkhash:16].js', minChunks: Infinity }) ] }, entry: { vendor: ['vue', 'vue-router', 'es6-promise'], index: './src/entry/index/index.js', login: './src/entry/center/login.js' }, HtmlWebpackPlugin: [ // 首頁:index.html new HtmlWebpackPlugin(merge(defaultHtmlWebpackConfig, { title: "首頁", filename: path.resolve(__dirname, '../dist/index.html'), chunks: ['vendor', 'index'] })), // 登陸註冊頁:center/login.html new HtmlWebpackPlugin(merge(defaultHtmlWebpackConfig, { title: "登陸", filename: path.resolve(__dirname, '../dist/center/login.html'), chunks: ['vendor', 'login'] })) ] }