vue 移动端项目搭建


1 安装vue脚手架

npm install -g vue-cli 
vue init webpack

https://segmentfault.com/a/1190000011275993


2 index.html

    
    
    
    
    
    
    
    

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

  • axios
    NProgress
// 基础配置
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包


  • 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文件时,可能出现了页面空白的现象,


    

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 输入框 点击收起键盘后 微信浏览器页面不回弹 留有空白

// js
function kickBack () {
      setTimeout(() => {
        window.scrollTo(0, document.body.scrollTop + 1)
        document.body.scrollTop >= 1 && window.scrollTo(0, document.body.scrollTop - 1)
      }, 10)
    }

参考


你可能感兴趣的:(vue 移动端项目搭建)