Vue-cli @4.0 通用项目模板 Posted 2021-04-16 js前端架构
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vue-cli @4.0 通用项目模板相关的知识,希望对你有一定的参考价值。
老样子,喜欢还请转发+关注哟
最近想升级一下技术架构,发现新版本的脚手架和之前的区别有点大。
基于此,在这里做下配置说明以及一些自定义的功能实现。
<< SPA单页面应用功能点 >>
1. router实现 √ done
2. 页面过渡动画实现 √ done
3. 接口代理 √ done
4. 三方文件引入 √ done
5. 自定义构建钩子 √ done
6. 移动端适配 √ done
<< MPA多页面应用功能点 >>
1. 多入口实现 √ done
2. 单页面多页面混合 √ done
3. 接口代理 √ done
4. 三方文件引入 √ done
5. 自定义构建钩子 √ done
6. 移动端适配 √ done
以上所有功能点均已实现并在 gitHub 开源。
有需要的同学点击下方阅读原文自取。
本文主要是简单的介绍项目是如何搭建,以及对应功能点的实现方案,是一篇入门文章,内容可能过于简单,请选择性查看。
下一篇文章会对内部功能进行说明,例如单元测试、e2e 测试、pwa 实现等。
此外还有一个较大的前端模板工具项目(juggle)也在整理过程中,该项目可以实现页面可视化配置,用于实现 json to page。有兴趣的同学抓紧关注~~
? Please pick a preset:
default (babel, eslint) //默认,包含基础的babel和eslint
❯ Manually select features //自定义
? Check the features needed for your project:
◉ Babel //ES6转ES5
◯ TypeScript
◉ Progressive Web App (PWA) Support //PWA
◉ Router //vue-router
◉ Vuex //单页面应用的状态管理模块
◉ CSS Pre-processors //CSS预处理(less/sass)
◉ Linter / Formatter //代码检查
◉ Unit Testing //单元测试
❯◉ E2E Testing //端对端测试
当然你也可以在项目创建后,使用 vue add eslint 来补充插件
Use history mode for router? (Requires proper server setup for index fallback in production)(Y/n) //输入N
是否使用 history 模式的前端路由, N 不使用
? Pick a CSS pre-processor (PostCSS, Autoprefixer and CSS Modules are supported by default):
Sass/SCSS (with dart-sass)
Sass/SCSS (with node-sass)
❯ Less // 因为我的服务上 node-sass 总是出现问题,在这里我选择了less,随喜好各自选择。
Stylus
? Pick a linter / formatter config: (Use arrow keys)
❯ ESLint with error prevention only //仅防止异常格式
ESLint + Airbnb config //Airbnb 配置
ESLint + Standard config //标准配置
ESLint + Prettier
? Pick additional lint features: (Press <space> to select, <a> to toggle all, <i> to invert selection)
❯◉ Lint on save //保存时
◯ Lint and fix on commit //提交时
? Pick a unit testing solution: (Use arrow keys)
Mocha + Chai
❯ Jest
Pick a E2E testing solution: (Use arrow keys)
❯ Cypress (Chrome only) //仅支持chrome
Nightwatch (WebDriver-based) //基于WebDriver
? Where do you prefer placing config for Babel, PostCSS, ESLint, etc.? (Use arrow keys)
❯ In dedicated config files //在专属的配置文件中
In package.json //在package.json中
选择Babel,PostCSS,ESLint配置的储存位置,单独文件还是统一放到package.json中
Save this as a preset for future projects? (y/N) //Y
配置保存,保存后的配置文件可以在下次创建项目时直接使用。
Vue-cli 项目结构:
网站根目录,可以放一些公共资源目录,相当于老版本的static目录,build时所有文件会被copy到dist目录下。
你可以将一些版本不会发生变化的文件直接放到此目录下。
例如:我们想在页面中引用echarts库,可以这么操作:
2. copy 文件 echarts-all.js 到 static 目录下
与public目录类似,也是用来存放静态资源的目录。
二者的区别是public目录下文件只会简单的被copy到dist目录。
assets目录下文件会经过webpack处理,压缩合并或者图片转base。
所以,不需要构建的文件放到public下,例如三方库,robots文件,小程序/公众号的验证文件等。
需要参与构建过程的文件要放到assets下,例如vue中引用的图片资源
组件目录,没有特殊含义,用来区分文件夹功能。可以将一些自定义的组件放到此目录下。
前端路由目录, 具体的路由配置写到index.js中,详细配置放到后面讲
vuex目录,公众号里有一篇关于vuex的使用介绍。
在单页面应用的情况下,App.vue 为 index页面对应的Vue文件
全局入口配置,在此文件中初始化全局的Vue示例,以及Router,vuex的引入
/src/registerServiceWorker.js
PWA配置,它需要与manifest.json文件搭配使用。
此目录下为端对端测试代码,可以实现页面的自动化UI测试功能。
此文件为CSS编译时的浏览器兼容配置。具体配置参考:https://github.com/browserslist/browserslist
为了体现通用模板,我们考虑有可能在PC端使用此模板,所以增加IE的版本支持,从IE9开始,因此
增加了配置:not ie <= 8
此文件为代码格式化检查配置,具体配置参考:https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-eslint
此文件为git文件忽略配置,用来忽略不想加入版本控制的文件。
此文件为 babel 代码转换的配置,具体配置参考:https://cli.vuejs.org/zh/guide/browser-compatibility.html#polyfill
此文件为端对端测试配置文件,具体配置参考:https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-e2e-cypress
此文件为Jest单元测试配置文件,具体配置参考:https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-unit-jest
package.json、package-lock.json
了解完了目录结构之后我们要开始实现一些通用功能了,比如一些公共的方法,公共的插件。我们把这些配置放到 assets/js/common.js 文件中,还有一些公共的样式文件,我们把它放到 assets/style 目录下。assets/style/base.less 文件存放顶层样式,例如 cssReset
在 assets/js/common.js 文件中 import base.less文件。
按照约定,base.less 只存放全局样式。目前该文件中包含了全局cssReset以及router切换动画
因为移动设备上的浏览器默认会在用户点击屏幕大约延迟300毫秒后才会触发点击事件,
为了能够立即响应用户的点击事件,我们引入 FastClick。
在 common.js 中的公共点击模块中增加以下代码:
const FastClick = require('fastclick');
FastClick.attach(document.body);
此模板使用 axios 进行页面请求,axios请求配置文件位于 /src/assets/js/axiosConfig.js
可在此文件内修改请求头,状态码处理,接口暴露修改等操作。
我们在开发过程中需要对接后端接口,通常会面临跨域问题。该问题我们需要借助 vue.config.js 文件。
vue.config.js 是一个可选的配置文件,如果项目的 (和 package.json 同级的) 根目录中存在这个文件,那么它会被 @vue/cli-service 自动加载。你也可以使用 package.json 中的 vue 字段,但是注意这种写法需要你严格遵照 JSON 的格式来写。
默认情况下执行npm run build 后资源路径为相对路径,但在实际项目中,资源一般会放在CDN节点上。
因此我们在 vue.config.js 中配置 publicPath 为对应的资源路径即可实现
在项目开发中,我们可能需要引入一些第三方插件,例如异常采集,百度统计文件等。
我们需要有一个配置用来在构建前插入第三方插件。
在老版本中,我是通过直接修改webpack配置的方式实现此功能。
vue-cli 4.0 版本较于 2.0 移除了build目录。
新版本中需要在 vue.config.js 文件中增加 configureWebpack 来进行配置。
具体实现的原理是我们要在 html-webpack-plugin 执行过程中对html内容进行修改,将自定义内容注入到打包结果里。
新增一个webpack插件,修改 afterTemplateExecution HOCK 来实现html内容修改。
示例:src/assets/js/insertHtmlPlugin.js 为实现结果,以插入百度统计代码为例。
移动端适配我们选择rem,作为通用脚手架,可能用来做移动端,也可能做PC端。关于项目的兼容性也要做考虑。
看了一下《如何在Vue项目中使用vw实现移动端适配》
所以我抛弃了 vw方案 与 px2rem-loader方案。使用 rem 布局方案。
关于rem,开始有考虑过 media 媒体查询,但是实际使用时发现也存在部分设备的不兼容。
最终决定通过修改淘宝 flexible 方案来实现,顺便可以支持大屏幕适配以及移动端适配。
rem文件通过webpack plugin 的方式注入页面,与百度统计代码注入方式相同。
之前的改动针对单页面应用,我期望的脚手架应该是单页面多页面通用的。你可以在此模板下直接开发单页面应用。
当业务需求需要补充新页面时,可以直接在项目下新建入口开发。
实现方案参考 vue-cli 2.0 的 util.entrys 方法,直接从htmls目录读取入口。
至此之后,每当需要新增一个页面时,需要做以下步骤。
1. 在 src/htmls/template 目录下添加新入口html文件。
2. 在 src/htmls/main 目录下添加同名js文件,在此文件中可以定义该页面的基础功能,例如:router、store、pwa
3. 对应的 router、store、pwa、pages 文件可以不同名,但为了保证维护性,还是保持文件名一一对应。
最后:
此模板会一直维护,保持与官方最新版本一致。做这个项目的原因是想整理一套开箱即用的通用模板,减少项目创建过程中的差异。最后附上最近在做的几个项目,希望各位给个 star ☺
juggle
地址:
https://github.com/adminV/juggle
阿里推出飞冰来进行页面搭建,但是飞冰的物料开发不是想象中的简单。 开发此项目,可以直接使用市面上线程的组件库(iview, vux, Element),也可以基于现有组件库封装自定义组件。 通过拖拽布局,生成页面配置 json 文件,实现所见即所得。
Vue-cli
地址:
https://github.com/adminV/vue-cli
@ vue/cli 4.0.* 配置示例详解。目标为产出一套多场景适用脚手架
nodePi
地址:
https://github.com/adminV/nodePi
以上是关于Vue-cli @4.0 通用项目模板的主要内容,如果未能解决你的问题,请参考以下文章
使用脚手架 vue-cli 4.0以上版本创建vue项目
自定义自己的vue-cli模板
vue-cli3.0/4.0搭建项目
vue多页面项目搭建(vue-cli 4.0)
vue-cli4.0 + TS 创建新项目
vue-cli4.0脚手架安装