1 安装vue脚手架
npm install -g vue-cli
vue init webpack
https://segmentfault.com/a/1190000011275993
2 index.html
<!-- 移动端设置 -->
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1,minimum-scale=1, user-scalable=no">
<!-- 指定请求和响应遵循的缓存机制 -->
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
<!-- 禁止浏览器从本地计算机的缓存中访问页面内容 -->
<meta http-equiv="Pragma" content="no-cache" />
<!-- 可以用于设定网页的到期时间。一旦网页过期 -->
<meta http-equiv="Expires" content="0" />
https://segmentfault.com/a/1190000009705754
3 插件安装
- fastclick 插件 (解决移动端点击延迟)
- vconsole (调试控制台实例化及配置)
var vConsole = new VConsole({
defaultPlugins: ['system', 'network', 'element', 'storage'],
onReady () {},
onClearLog () {},
toJSON () {},
maxLogNumber: 100
})
console.log(vConsole.version)
- 移动端rem设置 (直接引入文件即可)
(function (doc, win) {
// 以苹果6 375px为标准 1rem为10px
var docEl = doc.documentElement
var resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize'
var recalc = function () {
var clientWidth = docEl.clientWidth
if (!clientWidth) return
docEl.style.fontSize = 2 * (clientWidth / 75) + 'px'
}
if (!doc.addEventListener) return
win.addEventListener(resizeEvt, recalc, false)
doc.addEventListener('DOMContentLoaded', recalc, false)
})(document, window)
-
VUX
- 安装插件
npm install vux --save
vux安装有依赖 vux-loader 需安装 vux-loader
- 配置
build/webpack.base.conf.js
const vuxLoader = require('vux-loader')
const webpackConfig = originalConfig // 原来的 module.exports 代码赋值给变量 webpackConfig
module.exports = vuxLoader.merge(webpackConfig, {
plugins: ['vux-ui']
})
- 未安装 sass less 可能会报错 建议安装
sass-loader
node-sass
less-loader
// 基础配置
const apiServer = axios.create({
baseURL: 'api接口路径' // 配置基础的api接口路径
})
// 请求 响应的拦截设置
instance.interceptors.request.use(config => {
NProgress.start()
return config
}, error => {
NProgress.done()
return Promise.reject(error)
})
instance.interceptors.response.use(res => {
// 根据返回状态码配置不同的跳转路径
if (res.data.code === 222) { // 状态码瞎写的
// 调到相应 的路径
}
NProgress.done()
return res
}, error => {
NProgress.done()
return Promise.reject(error)
})
export default apiServer
4 打包优化
- uglifyjs-webpack-plugin 优化打包代码体积
build/webpack.base.conf.js 文件下
new UglifyJsPlugin({
// 参考资料 https://webpack.wuhaolin.cn/4%E4%BC%98%E5%8C%96/4-8%E5%8E%8B%E7%BC%A9%E4%BB%A3%E7%A0%81.html
uglifyOptions: {
compress: {
// 在UglifyJs删除没有用到的代码时不输出警告
warnings: false,
// 删除所有的 `console` 语句,可以兼容ie浏览器
drop_console: true,
// 内嵌定义了但是只用到一次的变量
collapse_vars: true,
// 提取出出现多次但是没有定义成变量去引用的静态值
reduce_vars: true,
},
output: {
// 最紧凑的输出
beautify: false,
// 删除所有的注释
comments: false,
}
}
}),
- 引入外部 cdn 文件 减少 打包代码体积
- index.html 文件引入 cdn js包
<script src="https://cdn.bootcss.com/vue/2.5.22/vue.js"></script>
<script src="https://cdn.bootcss.com/vue-router/3.0.1/vue-router.min.js"></script>
- build/webpack.base.conf.js 文件 设置
externals
externals: {
'vue': 'Vue',
'vue-router': 'VueRouter'
},
参照 cdn网站对应js版本, axios
vuex
等都可以引用
externals可以用来引用非模块化的 js包
不要用 import
引入文件
- 相应 文件中引入
/* global Vue */
/* global VueRouter */
Vue.use(VueRouter)
手机端在引入cdn js文件时,可能出现了页面空白的现象,
<script src="https://cdn.bootcss.com/vue/xxxx.xx.xx/vue.js"></script>
<script>!window.Vue && document.write(unescape('%3Cscript src="https://cdn.jsdelivr.net/npm/vue@xxxx.xx.xx/dist/vue.min.js"%3E%3C/script%3E'))</script>
tips: cdn文件加载出错时 处理
5 关于编译环境和线上环境之间的切换
- 安装插件 cross-env
cross-env
可以设置一个环境变量,在打包
的时候 ,根据变量配置不同的接口路径
- 相关配置修改
- 1 build/webpack.prod.conf.js
// const env = process.env.NODE_ENV === 'testing' //注释 // ? require('../config/test.env') //注释 // : require('../config/prod.env') //注释 const env = config.build[process.env.env_config+'Env']
- 2 build/build.js
// process.env.NODE_ENV = 'production' //注释
const ora = require('ora')
const rm = require('rimraf')
const path = require('path')
const chalk = require('chalk')
const webpack = require('webpack')
const config = require('../config')
const webpackConfig = require('./webpack.prod.conf')
// const spinner = ora('building for production...') //注释
var spinner = ora('building for ' + process.env.NODE_ENV + ' of ' + process.env.env_config+ ' mode...' )
- 3 config/index.js
build: {
prodEnv: require('./prod.env'),
testEnv: require('./test.env'),
// Template for index.html //注释
// ...
}
- 4 config/test.env.js
'use strict'
module.exports = merge(devEnv, {
NODE_ENV: '"testing"',
ENV_CONFIG:'"test"' // 添加
})
- 5 config/prod.env.js
'use strict'
module.exports = {
NODE_ENV: '"production"',
ENV_CONFIG:'"prod"' // 添加
}
- 6 根据不同的环境变量配置接口路径
let baseUrl = '' // 用于axios
let consoleFlag = true // 用于 VConsole 插件的控制
if (process.env.NODE_ENV === 'development') {
baseUrl = '开发环境'
consoleFlag = true
} else if (process.env.NODE_ENV === 'production') {
baseUrl = '生产环境'
consoleFlag = false
} else if (process.env.NODE_ENV === 'testing') {
baseUrl = '测试环境'
consoleFlag = true
}
export default {
baseUrl,
consoleFlag
}
- 7 配置script 脚本
"scripts": {
// ...
"build--test": "cross-env NODE_ENV=testing env_config=test node build/build.js",
"build--prod": "cross-env NODE_ENV=production env_config=prod node build/build.js"
},
npm run build--test 或 npm run build-prod 运行
6 关于公众号配置
-
获取公众号用户信息
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842 -
配置测试公众号
问题
1 接口配置信息 提交报错原因
https://blog.csdn.net/qq_34096082/article/details/79985141
2 js接口安全域名配置
http://support.epub360.com/hc/kb/article/23295/
3 测试号设置 自定义菜单问题
https://blog.csdn.net/hqsary/article/details/82347862
4 自定义菜单设置
https://mp.weixin.qq.com/debug/cgi-bin/apiinfo?t=index
https://blog.csdn.net/hanchao5272/article/details/79609045
- 公众号添加
MP_verify_lIKdghztnOYpMXx1.txt
文件配置
可以通过前端 copy-webpack-plugin
插件配置
new CopyWebpackPlugin([
{
from: path.resolve(__dirname, '../static'),
to: config.build.assetsSubDirectory,
ignore: ['.*']
},
{
from: path.resolve(__dirname, '../src/xx'), // MP_verify_lIKdghztnOYpMXx1.txt 文件地址
to: path.resolve(__dirname, '../dist'),
ignore: ['.*']
}
])
7 兼容问题
- ios 点击延迟
const str = navigator.userAgent.toLowerCase()
const ver = str.match(/cpu iphone os (.*?) like mac os/)
if (!ver) { // 非IOS系统
// 引入fastclick 做相关处理
document.addEventListener('DOMContentLoaded', function () {
FastClick.attach(document.body)
}, false)
} else {
if (parseInt(ver[1]) < 11) {
// 引入fastclick 做相关处理
document.addEventListener('DOMContentLoaded', function () {
FastClick.attach(document.body)
}, false)
}
}
简单的说就是ios 11 以上版本的点击延迟已经处理 参考
- ios 输入框 点击收起键盘后 微信浏览器页面不回弹 留有空白
<input type="text" @blur="kickBack" placeholder="手机号 / Account" />
// js
function kickBack () {
setTimeout(() => {
window.scrollTo(0, document.body.scrollTop + 1)
document.body.scrollTop >= 1 && window.scrollTo(0, document.body.scrollTop - 1)
}, 10)
}
网友评论