前言

目前项目用的vue + element-ui,之前有了解过element-ui真正的按需引入,也有了解到主题定制,之前的项目都是根据element-ui的类及标签,在全局或者局部进行一大堆样式覆盖,达到自己项目ui的样式,项目中按需引入实际也并没有真正实现按需引入。趁此新起的项目。实践一下对 element-ui 主题和组件方面来优化。

完整引入

完整地将 ui 和样式引入。

import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'

在页面简单使用 button组件,看看效果。

<el-button type="primary">Login</el-button>

再看一下打包后的资源大小情况npm run build --report

Hash: 40db03677fe41f7369f6
Version: webpack 3.12.0
Time: 20874msAsset SizeChunksChunk Namesstatic/css/app.cb8131545d15085cee647fe45f1d5561.css 234 kB 1[emitted] app static/fonts/element-icons.732389d.ttf56 kB[emitted] static/js/vendor.a753ce0919c8d42e4488.js 824 kB 0[emitted][big]vendorstatic/js/app.8c4c97edfce9c9069ea3.js3.56 kB 1[emitted] app static/js/manifest.2ae2e69a05c33dfc65f8.js857 bytes 2[emitted] manifeststatic/fonts/element-icons.535877f.woff28.2 kB[emitted]
static/css/app.cb8131545d15085cee647fe45f1d5561.css.map 332 kB[emitted] static/js/vendor.a753ce0919c8d42e4488.js.map3.26 MB 0[emitted] vendorstatic/js/app.8c4c97edfce9c9069ea3.js.map16.6 kB 1[emitted] app static/js/manifest.2ae2e69a05c33dfc65f8.js.map4.97 kB 2[emitted] manifest index.html506 bytes[emitted]

发现打包后提取公共模块 static/js/vendor.js 有 824kb

再看一下各个模块占用情况:

发现 elment-ui.common.js 占用最大。所有模块资源总共有 642kb。怎么才能减小打包后的大小呢?很容易就会想到 ui 的引入和样式的引入中,实际我们只使用了一个组件,却整体都被打包了,在这里引入这一个组件即可。

按需引入组件样式

再次打包优化尝试

后来查到有人同样遇到这个问题,提出一个issues#6362,原来只引入需要的element-ui组件,webpack还是把整体的 UI 库和样式都打包了,需要一个 webpack 的 babel 插件 babel-plugin-component,这样才能真正按需引入打包。这块其实被写到官方文档更换 自定义主题 的配置了。

于是 npm i babel-pugin-componet -D 安装后,在增加 .babelrc 文件插件配置

{"presets": [["@babel/preset-env", { "modules": false }]],"plugins": [["component",{"libraryName": "element-ui","styleLibraryName": "~theme"}]]
}

注意:presets如果是env,有问题,换成@babel/preset-env就可以 页面运行正常,再次打包。

Hash: f182f70cb4ceee63b5d5
Version: webpack 3.12.0
Time: 10912msAsset SizeChunks Chunk Namesstatic/css/app.95c94c90ab11fdd4dfb413718f444d0c.css39.9 kB 1[emitted]app static/fonts/element-icons.732389d.ttf56 kB[emitted] static/js/vendor.befb0a8962f74af4b7e2.js 157 kB 0[emitted]vendorstatic/js/app.5343843cc20a78e80469.js3.86 kB 1[emitted]app static/js/manifest.2ae2e69a05c33dfc65f8.js857 bytes 2[emitted]manifeststatic/fonts/element-icons.535877f.woff28.2 kB[emitted]
static/css/app.95c94c90ab11fdd4dfb413718f444d0c.css.map93.5 kB[emitted] static/js/vendor.befb0a8962f74af4b7e2.js.map 776 kB 0[emitted]vendorstatic/js/app.5343843cc20a78e80469.js.map17.1 kB 1[emitted]app static/js/manifest.2ae2e69a05c33dfc65f8.js.map4.97 kB 2[emitted]manifest index.html506 bytes[emitted]

static/js/vendor.js 确实变小了,157kB。再来看各个模块分析图。

模块总共 157.93KB,少了 5 倍!

主题和主题工具安装

首先安装主题工具 element-theme element-theme-chalk,可以全局安装也可安装在项目目录。这里推荐安装在项目录,方便别人 clone 项目时能直接安装依赖并启动。

1.element-theme element-theme-chalk安装
npm i element-theme element-theme-chalk -D

然后创建element-variables.scss文件,内容如下

$--color-primary: red !default;

所有的主题色就变为红色了,效果如下图

通过 Node API 构建方式

最后引入 element-theme 通过 Node API 形式构建 创建theme.js,内容如下

const et = require('element-theme')
// 第一步生成样式变量文件
// et.init('./src/theme.scss')
// 第二步根据实际需要修改该文件
// ...
// 实时编译模式
// et.watch({
// config: './element-variables.scss',
// out: './theme/index.css'
// })
// 第三步根据该文件编译出自定义的主题样式文件
et.run({config: '', // 配置参数文件路径 默认`./element-variables.css`out: '' // 输出目录 默认`./theme`
})

在 package.json 中增加 scripts 指令

{"scripts": {"theme": "node theme.js"}
}

这样就可以通过 npm run theme 指令来编译主题了。编译过程:

  • 运行该指令初始化主题变量文件 element-variables.scss
  • 根据实际需要修改这个文件里主题样式。
  • 再运行该指令编译输出自定义的主题样式文件放在 theme 目录下。

在执行对应的部署指令,就可以上线了

总结

通过以上实验分析我们可以得知,element-ui 要想实现按需引入和纯净的主题样式:

  • 首先通过 babel-plugin-component 插件进行按需引入。
  • 再用 element-theme 工具生成样变量文件。
  • 然后根据项目需求修改自定义样式,依据该文件构建生成所有样式。
  • 最后将按需引入样式 styleLibraryName 指向自定义样式目录。

这是我项目中最终实现的定制,参考

vue中babel-plugin-component按需引入和element-ui 的主题定制,支持发布,上线相关推荐

  1. vue项目,引入插件element ui 样式不生效

    用vue ui 命令 引入插件 element ui 样式不生效 步骤一:执行如下命令,安装babel-plugin-component npm install babel-plugin-compon ...

  2. Vue引入第三方Element UI 组件

    Element UI 官网地址: 各种基于Vue.js的各种UI组件 https://element.eleme.cn/#/zh-CN/component/quickstart https://ele ...

  3. Vue中的Class Component使用指南

    作者 | CherishTheYouth 来源 | https://www.cnblogs.com/CherishTheYouth/ 一般性指引 使用@Component注解,将类转化为 vue 的组 ...

  4. Vue中components与component的区分

    英文意思 components:组件 component:组成部分 出现场景 component 路由规则中: 2.内置标签中 全局组件中 components 组件文件夹中 局部注册组件中 在单页面 ...

  5. 在vue中的style标签内如何引入外部的css文件

    1.使用style标签引入 <style src="../common/css/bodycss.css"></style> 2.在style标签内使用@im ...

  6. vue中使用qrcode.js,封装一个生成二维码的组件(支持下载和copy二维码里面的链接)

    这是一个自己封装的组件 市面上还有其他组件: vue-qr :这个可以给二维码中间加图片 本次封装组件的实例图如下: 下载qrcodde npm i qrcode -S 下载复制的插件 npm i v ...

  7. vue下拉框值改变事件_vue和element ui 下拉框select的change事件

    1 在线编辑测试工具 编辑好代码后点击 run 即可 2 vue原生写法 2.1 html部分 新增 空 {{ drug.name }} 刪除 尚未新增任何資料 總金額:{{ totalMoney } ...

  8. vue项目中按需引入viewUI

    viewUI 一.按需引入 二.忽略eslint编译器检测和编译检测 1.忽略编译器检测 2.编译器中忽略 一.按需引入 npm install babel-plugin-import --save- ...

  9. element ui需要引入样式吗_彻底学会element-ui按需引入和纯净主题定制

    原标题:彻底学会element-ui按需引入和纯净主题定制 作者:wuwhs 来源:SegmentFault 思否社区 前言 手上有些项目用的element-ui,刚好有空琢磨一下怎么减小打包文件大小 ...

  10. vue3.0+ts+element-plus多页签应用模板:element-plus按需引入与动态换肤

    目录 系列链接 一.安装element-plus 二.按需引入 1. 为什么要按需引入? 2. 如何按需引入? 3. 验证是否引入成功 三.动态换肤 1. 制作自定义主题 2. 引入自定义主题 3. ...

最新文章

  1. EST | 系统评价污水样品中选定药物、非法药物及其代谢物的稳定性
  2. javascript基础系列(入门前须知)
  3. Java数据库连接(JDBC)之二:Statement对象和PreparedStatement对象的使用
  4. MFC文档/视图结构体系及SDI回顾(2)
  5. php - 冒泡排序
  6. Linux笔记-Centos7将python2升级为python3(及修改yum配置防报错)
  7. iOS底层探索之KVO(三)—自定义KVO
  8. linux以二进制查看文件内容,Linux下二进制文件的查看和编辑
  9. Eclipse Debug功能的使用教程
  10. android怎么防8门神器,八门神器(GameKiller)怎么用?安卓版使用教程
  11. Keras机器翻译实战
  12. 生物特征认证和识别市场现状及未来发展趋势
  13. 生物信息学最基础知识
  14. 目标检测 (Detection) 算法综述
  15. 微店API,item_search_shop - 获得店铺的所有商品
  16. codeforces B. Ternary Sequence
  17. 快消品图像识别丨无人店背后的商品识别技术
  18. 全文干货:蓝牙耳机哪个品牌最好?平价好用的蓝牙耳机推荐
  19. 从一个html页面传值到另一个页面,两个html之间的值传递(js location.search用法)
  20. 使用Qt开发的优秀软件汇总

热门文章

  1. 有些心情写给自己,也只能写给自己
  2. 提取中文句子主谓宾的Java实现
  3. mysql 字符集等设置_MySQL字符集设置
  4. 互动拍照打卡,智能终端化身网红应用
  5. CAD软件中特殊字符如何输入
  6. h5 html分页样式,原创H5分页器
  7. js 的内存,堆和栈
  8. 元素div 上下左右居中方法总结
  9. 支持加密和虚拟账号的ftp搭建
  10. 中国传统剪纸风工作汇报总结新年年会设计PPT模板