Web开发

首页 » 常识 » 诊断 » 前端开发框架之Vue
TUhjnbcbe - 2023/5/14 8:42:00
辽宁白癜风医院 http://m.39.net/baidianfeng/a_4753196.html

1.分解需求

技术栈

考虑到后续招人和现有人员的技术栈,选择Vue作为框架。

公司主要业务是GIS和BIM,通常开发一些中大型的系统,所以vue-router和vuex都是必不可少的。

放弃了ElementUI选择了AntDesignVue(最近Element好像复活了,麻蛋)。

工具库选择lodash。

建立脚手架

搭建NPM私服。

使用Node环境开发CLI工具。

基于

vue/cli搭建基础的模板(大家都比较了解,节省开发时间,远胜于从零开始搭建)。

根据业务需求定义各种开发中可能用到的功能(组件库、状态管理、过滤器、指令、CSS内置变量、CSSMixins、表单验证、工具函数等)。

性能优化,例如对AntDesignVue组件库的优化。

开发规范

对代码风格、命名规则、目录结构进行统一规范。

静态资源的使用规范。

单元测试、提交线上测试规范。

Git提交记录和多人协作规范。

2.样式

CSS预处理器的选择

Sass/Scss

Less

Stylus

为什么选择了两个?因为公司团队跟倾向于使用scss开发,less是为了覆盖antdesignvue的样式,stylus只有我自己喜欢这种风格。

局部样式与全局样式

局部样式

一般都是使用scoped方案:

stylescoped.../style

全局样式

全局样式目录:

/styles

variable.scss:全局变量管理mixins.scss:全局Mixins管理global.scss:全局样式

其中variable.scss和mixins.scss会优先于global.css加载,并且可以不通过import的方式在项目中任何位置使用这些变量和mixins。

//vue.config.jsmodule.exports={css:{loaderOptions:{sass:{prependData:`

import

/styles/variable.scss;

import

/styles/mixins.scss;`,},},},}

体验优化

页面载入进度条

使用nprogress对路由跳转时做一个伪进度条,这样做在网络不好的情况下可以让用户知道页面已经在加载了:

importNProgressfromnprogress;router.beforeEach(()={NProgress.start();});router.afterEach(()={NProgress.done();});

美化滚动条

一直用Mac做前端,突然发现同事的Windows上出现了十分丑陋的滚动条,为了保持一致:

::-webkit-scrollbar{width:6px;height:6px;}::-webkit-scrollbar-track{width:6px;background:rgba(#F1C,0.1);-webkit-border-radius:2em;-moz-border-radius:2em;border-radius:2em;}::-webkit-scrollbar-thumb{background-color:rgba(#F1C,0.5);background-clip:padding-box;min-height:28px;-webkit-border-radius:2em;-moz-border-radius:2em;border-radius:2em;}::-webkit-scrollbar-thumb:hover{background-color:rgba(#F1C,1);}

静态资源加载页面

首次加载页面时,会产生大量的白屏时间,这时做一个loading效果看起来会很友好,其实很简单,直接在public/index.html里写一些静态的样式即可。

移动端vh问题

在移动端使用vh时,发现在Chrome、Safari浏览器中,因为浏览器栏和一些导航栏、链接栏导致不一样的呈现:

你以为的vh===视口高度

实际上vh===视口高度+浏览器工具栏(地址栏等等)的高度

解决方案

安装vh-checknpminstallvh-check\--save

importvhCheckfromvh-check;vhCheck(browser-address-bar);

定义一个CSSMixin

mixinvh($height:vh){height:$height;height:calc(#{$height}-var(--browser-address-bar,0px));}

之后就是哪里不会点哪里。

3.组件库

因为ElementUI长期没更新,并且之前使用过React的AntDesign(重点),所以组件库选择了AntDesignVue。

覆盖AntDesignVue样式

设计师眼中的AntDesign===丑(心酸)。

1.使用.less文件

AntDesignVue的样式使用了Less作为开发语言,并定义了一系列全局/组件的样式变量,所以需要安装了less、less-loader,在

/styles/antd-theme.less可以覆盖默认样式。

优点是:

方便快捷,可以修改class,覆盖默认变量。

缺点是:

必须引入

import~ant-design-vue/dist/antd.less;,引入后会将所有的组件样式全部引入,导致打包后的css体积达到kb左右。

2.使用JavaScript对象

通过JavaScript对象的方式可以修改内置变量,需要对Less进行配置:

//vue.config.jsconstmodifyVars=require(./src/styles/antdTheme.js);module.exports={css:{loaderOptions:{less:{lessOptions:{javascriptEnabled:true,modifyVars,},},},},}

这一步还可以继续优化,通过babel-plugin-importAntDesignVue的组件样式可以按需加载:

//babel.config.jsmodule.exports={presets:[

vue/cli-plugin-babel/preset,],plugins:[[import,{libraryName:ant-design-vue,libraryDirectory:es,style:true},],],};

优点是:

可以按需引入,打包后的CSS体积取决于你引用了多少个组件。

缺点是:

不能使用class进行样式覆盖。

干掉无用的图标

AntDesignVue把所有的Icon一次性引入(不管你因用了多少个组件),这使得体积打包后图标所占的体积竟然有几百kb之多。这些图标大多数不会被设计师所采纳,所以部分图标都应该被干掉:

创建一个icons.js来管理AntDesignVue图标,这里以一个Loading图标为例:

//

/src/assets/icons.jsexport{defaultasLoadingOutline}from

ant-design/icons/lib/outline/LoadingOutline;

如何知道你要加载的图标在什么路径下?

ant-design/icons/lib目录下有三种风格的图标,分别是fill、outline、twotone,这里面内部的文件并不是svg格式,而是js和ts格式,这就是为什么我们可以这么引入图标的关键所在了。

下一步是通过配置vue.config.js将这个文件引入进来:

//vue.config.jsmodule.exports={configureWebpack:{resolve:{alias:{

ant-design/icons/lib/dist$:path.resolve(__dirname,./src/assets/icons.js),},},},}

解决Moment多国语

解决到这之后,AntDesignVue居然还很大,这是因为moment是AntDesignVue中有强依赖该插件,所以使用webpack插件减小打包体积,这里我们只保留zh-cn语言包:

//vue.config.jsmodule.exports={chainWebpack:(config)={config.plugin(ContextReplacementPlugin).use(webpack.ContextReplacementPlugin,[/moment[/\\]locale$/,/zh-cn/]);},}

部分组件需要在页面内引用

AntDesignVue中部分体积较大的组件,例如DatePicker,根据业务需求,应考虑在页面中进行加载,尽量保证首屏加载的速度:

scriptimport{DatePicker}fromant-design-vue;exportdefault{

1
查看完整版本: 前端开发框架之Vue