前段时间项目组计划快速开发一个新的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'] })) ] }