美文网首页
vue 移动端项目搭建

vue 移动端项目搭建

作者: _旁观者_ | 来源:发表于2019-07-05 15:15 被阅读0次

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

    参考


    相关文章

      网友评论

          本文标题:vue 移动端项目搭建

          本文链接:https://www.haomeiwen.com/subject/nxxdqctx.html