vue-cli4 + vantUI + rem适配的H5项目模板

1,620 阅读4分钟

1、多环境开发

这里有个变量NODE_ENV,我们在config/index.js中统一管理。

2、rem适配方案

我们的设计稿都是px值,所以项目中如果需要使用rem单位的话,需要借用工具包来转化下:

这里将使用postcss-pxtorem和lib-flexible来设置rem。

首先是postcss配置:

module.exports = {   
 plugins:{    
    // autoprefixer: {    
    // browsers: ['Android >= 4.0', 'iOS >= 8']     
    // 
},    
'postcss-pxtorem': {      
    // rootValue: 37.5, // Vant 官方根字体大小是 37.5 
    rootValue({file}) {    
       return file.indexOf('vant') !== -1 ? 37.5 : 75      
    },     
    propList: ['*'],   
    selectorBlackList: ['.norem'] // 过滤掉.norem-开头的class,不进行rem转换  
 }  
},}

3、Less全局样式

vue h5模板项目的所有全局样式在@src/assets/css中统一设置

但是我们项目模板中引入了VantUI,某些地方需要重置样式。

第一种,不想在某个页面加上scoped,但是又想覆盖该页面的vant样式,就可以在该页面的父容器加上一个class样式,例如:

.xx {
    .van-button {}
}

第二种,父组件改变子组件样式  深度选择器

如果子组件使用了scoped,但在父组件又想修改子组件的样式可以通过>>>来实现

<style scoped>
    .a >>> .b {}
</style>

第三种,全局变量

vue.config.js配置使用css.loaderOptions选项,注入less的mixin variables到全局,不需要手动引入,这样向所有的less样式传入共享的全局变量:

4、VantUI组件按需加载

使用babel-plugin-import来实现Vant按需引入组件,它是一款babel插件,会在编译过程中将import的写法自动转化为按需引入的方式。

1、安装插件

npm i babel-plugin-import -D

2、在babel.config.js 中设置

但是有一个问题是:在页面使用的时候还是需要引入,所以可以在src/plugins/vant.js中统一管理组件,这样我们就可以需要哪个引入哪个,不需要重复引入了,减少了工作量。

5、Vuex状态管理

首先是状态管理的目录结构

在入口文件main.js中引入

然后是各个页面的使用

<script>
    import { mapGetters } from 'vuex'
    export default {
        computed: {
            ...mapGetters(['userName'])
        },
        methods: {
            doDispatch() {
                this.$store.dispatch ('setUserName', '111')
            }
        }
    }
</script>

6、Vue-router

我们采用的是路由hash模式

hash模式介绍:这是开发中的默认模式,在url中永远带着#号,在浏览器方面其支持度极佳,并且可以兼容低版本的IE浏览器。

这里我们来说一下前端路由的原理:

window是可以监听到哈希值的变化的,使用onhashchange事件,这就意味着,当url中的哈希值发生了变化,无需发起HTTP请求,window也可以监听到这种变化,并按需加载前端的代码块,哈希模式也是当下单页面应用的标配。所以前端路由的强大之处就是:路由分发不需要服务器来做,前端自己就可以完成。

本项目模板中,我们在router/index.js中配置下:

7、Axios接口封装,接口统一管理

在utils/request.js封装axios,方便开发者可以根据后台接口做修改。

在service.interceptors.request.use中可以设置请求头,例如设置Token

config.hideloading是在api文件夹下的接口参数里设置

service.interceptors.response.use里可以对接口返回数据处理,例如401删除本地信息,重新登录。

统一进行接口管理

在src/api文件夹下统一管理接口

分为url(接口地址,请求的时候会拼接上config下的baseApi),method(请求方法),data(请求参数qs.stringify(params)是对数据系列化操作)

8、配置alias别名

在vue.config.js中配置alias别名,省掉根据../../来寻找文件。

9、配置proxy跨域

如果项目中需要跨域设置的话,在vue.config.js proxy注释并且配置相应参数。

10、配置打包分析

const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin

module.exports = {
    chainWebpack: config => {
        // 打包分析
        if (IS_PROD) {
            config.plugin('webpack-report').use(BundleAnalyzerPlugin, [
                {
                    analyzerMode: 'static'
                }
            ])
        }
    }
}

执行npm run build就可以看包的执行情况

11、阿里云构建配置文件

FROM 项目阿里云地址RUN npm install pm2@4.5.0 -gADD . /项目名称WORKDIR /项目名称RUN npm install# 上传OSS的构建RUN HOST=项目阿里云地址/ \PUBLIC_PATH="xxx/" \XXX_ENVIRONMENT=ontest/online \npm run build# 执行OSS上传RUN ACCESSKEY_ID=xxx \ACCESSKEY_SECRET=xxx \PUBLIC_PATH="xxx" \npm run 自定义Node中间件

12、总结一些优化

去掉正式环境的console.log

npm i -D babel-plugin-transform-remove-console

在babel.config.js中配置

// 获取 VUE_APP_ENV 非 NODE_ENV,测试环境依然 console
const IS_PROD = ['production', 'prod'].includes(process.env.VUE_APP_ENV)
const plugins = [
  [
    'import',
    {
      libraryName: 'vant',
      libraryDirectory: 'es',
      style: true
    },
    'vant'
  ]
]
// 去除 console.log
if (IS_PROD) {
  plugins.push('transform-remove-console')
}

module.exports = {
  presets: [['@vue/cli-plugin-babel/preset', {useBuiltIns: 'entry'}]],
  plugins
}

Eslint+Pettier统一开发规范

安装eslint prettier vetur插件,.vue文件使用vetur进行格式化,使用prettier

代码中在文件.prettierrc里写属于各自项目的pettier规则: