vue 移动端项目搭建


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 可以设置一个环境变量,在打包的时候 ,根据变量配置不同的接口路径

为啥用它


  • 相关配置修改
    • 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 关于公众号配置


问题  
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)
    }

参考


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,179评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,229评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,032评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,533评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,531评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,539评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,916评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,813评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,568评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,654评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,354评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,918评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,152评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,852评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,378评论 2 342

推荐阅读更多精彩内容