项目经验 面试题

可以这样回答:
我做过很多项目,我就拿一个我自己单独开发的项目来说吧。。。。

这个项目的技术栈是Vue全家桶 + JavaScript。

做这个项目前需要配置环境 有开发环境,测试环境,上线环境,这三个,
以及:
rem配制方案(使用Vant),
vm配置方案(使用Vant),
VantUI组件的按需加载(使用Vant),
Axios封装及接口管理,
配置proxy跨域,
添加IE兼容,

让项目后续的维护工作,更简单

添加IE兼容

使用core-js 和 regenerator-runtime

 cnpm i --save core-js regenerator-runtime

mian.js中添加

import 'core-js/stable'
import 'regenerator-runtiome/runtime'

配置babel.config.js

const plugins = []

module.exports = {
	presets:[['@vue/cli-plugin-babel/preser',{useBuiltIns : 'usage' , corejs : 3}]]
}

rem配置方案
Vant 中的样式默认使用px作为单位,如果需要使用rem单位,推荐使用以下两个工具:

  • postcss-pxtorem 是一款 postcss 插件,用于将单位转化为 rem
  • lib-flexible 用于设置 rem 基准值

安装并引入插件

1.安装依赖

cnpm i lib-flexible postcss-pxtorem --save-dev

2.mian.js导入

//移动端适配
import 'lib-flexible/flexible'

PostCSS配置
1.创建.postcssrc.js
下面提供一个基本的postcss配置,可以根据需求进行更改

module.exports = {
	plugins:{
		autoprefixer:{
			overrideBrowserslist:['Android 4.1' , 'iOS 7.1' , 'Chrome > 31' , 'ff > 31' , 'ie >= 8']
		},
		'postcss-pxtorem':{
			rootValue:75,
			propList:['*']
		}
	}
}

Tips: 在配置 postcss-loader 时,应避免 ignore node_modules 目录,否则将导致 Vant 样式无法被编译。

vm适配方案

1.安装依赖

cnpm i postcss-px-to-viewport -d 

2.修改 .postcssrc.js
将根目录下 .postcssrc.js 文件修改

module.exports = {
  plugins: {
    autoprefixer: {
      overrideBrowserslist: ['Android 4.1', 'iOS 7.1', 'Chrome > 31', 'ff > 31', 'ie >= 8']
    },
    'postcss-px-to-viewport': {
      viewportWidth: 375, // 视窗的宽度,对应的是我们设计稿的宽度,一般是750
      unitPrecision: 3, // 指定`px`转换为视窗单位值的小数位数(很多时候无法整除)
      viewportUnit: 'vw', // 指定需要转换成的视窗单位,建议使用vw
      selectorBlackList: ['.ignore', '.hairlines'], // 指定不转换为视窗单位的类,可以自定义,可以无限添加,建议定义一至两个通用的类名
      minPixelValue: 1, // 小于或等于`1px`不转换为视窗单位,你也可以设置为你想要的值
      mediaQuery: false // 允许在媒体查询中转换`px`
    }
  }
}

3.删除原来的rem相关代码
src/mian.js 删除如下代码

import 'lib-flexible/flexible.js'

package.json 删除如下代码

'lib-flexible' : "^0.3.2",
'postcss-pxtorem' : "^5.1.1"

Vant组件按需加载

采用Vant自动按需引入组件

babel-plugin-import 是一款 babel 插件,它会在编译过程中将import 的写法自动转换为按需引入的方式
安装插件

cnpm i babel-plugin-import -d

在babel.config.js 设置

const plugins = [
  [
    'import',
    {
      libraryName: 'vant',
      libraryDirectory: 'es',
      style: true
    },
    'vant'
  ]
]
module.exports = {
  presets: [['@vue/cli-plugin-babel/preset', { useBuiltIns: 'usage', corejs: 3 }]],
  plugins
}

使用组件
项目在src/plugins/vant.js 下统一管理组件, 用那个引入那个,无需在页面上重复引用

import Vue from 'vue'
import { Button, List , Cell , Tabbar , TabbarItem } from 'vant'
Vue.use(Button)
Vue.use(Cell)
Vue.use(List)
Vue.use(Tabbar).use(TabbarItem)

Axios封装及接口
utils/request.js 封装axios,开发者需要根据后台接口做修改。

import axios from 'axios';
import store from '@/store';
import { Toast } from 'vant';
import { baseApi } from "@/config";
const service = axios.create({
	baseURL:baseApi,
	withCredentials:true,
	timeout:1000*5
})

service.interceptors.request.use(config=>{
	if(!config.hideloading){
		Toast.loading({
			forbidClick:true
		})
	}
	if(store.getters.token) {
		config.headers['X-Token'] = ''
	}
	return config
},error=>{
	console.log(error)
	return Promise.reject(error)
})


service.interceptors.response.use(response=>{
	Toast.clear()
	const res = response.data
	if(res.status && res.status !== 200 ) {
		if(res.status === 401 ){
			store.dispatch('FedLogOut').then(()=>{
			location.reload()
		})
		}
		return Promise.reject(res || 'error')
	}else{
		return Promise.resolve(res)
	}
	
},error=>{
	Toast.clear()
	console.log('err' + error)
	return Promise.reject(error)
})

export default service

接口管理

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

  • 可以建立多个模块对接接口,比如 home.js 里是首页的接口
  • url 接口地址,请求的时候会拼接上config 下的 baseApi
  • method 请求方法
  • data 请求参数 qs.stringify(params)是对数据系列化操作
  • hideloading默认false,设置为true后,不再显示loading ui 交互中有些接口不需要让用户感知
import qs from 'qs'
import request from '@/utils/request'

export function getUserInfo(params){
	return request({
		url:"/user/userinfo",
		method:"post",
		data:qs.stringify(params),
		hideloading:true
	})
}

如何调用

import { getUserInfo } from "@/api/user.js"
const params = { user:'sunnie' }
getUserInfo(params).then(()=>{}).catch(()=>{})

!!!注意:你还需要将 src/config/env.development.js 里的 baseApi 设置成 '/'

module.exports = {
  devServer: {
    // ....
    proxy: {
      //配置跨域
      '/api': {
        target: 'https://test.xxx.com', // 接口的域名
        // ws: true, // 是否启用websockets
        changOrigin: true, // 开启代理,在本地创建一个虚拟服务端
        pathRewrite: {
          '^/api': '/'
        }
      }
    }
  }
}

使用 例如: src/api/home.js

export function getUserInfo(params) {
  return request({
    url: '/api/userinfo',
    method: 'post',
    data: qs.stringify(params)
  })
}
上一篇:h5移动端适配(px->vw/vh)


下一篇:webpack postcss插件