经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » webpack » 查看文章
基于webpack4+vue-cli3项目实现换肤功能
来源:jb51  时间:2019/7/17 11:02:08  对本文有异议

起因

最近因公司需求,需要实现主题换肤功能,不仅仅是颜色的更改,还需要包括图片,字体等文件等更换,因此在百度里各种实现方案后,决定根据scss+style-loader/useable做换肤。

项目开始

首先我们用vue-element-admin这个开源的后台管理系统项目来做demo演示,为了便于做二次开发,下载vue-admin-template来开发。

  1. // 从github下载vue-admin-template
  2. clone https://github.com/PanJiaChen/vue-admin-template.git
  3. cd vue-admin-template
  4. npm install
  5. npm run dev

运行成功后的效果

安装style-loader处理器

因为vue-admin-template项目是添加过sass-loader依赖的,所以不用我们再次安装,在上一步就已经安装好了。

  1. npm install style-loader --save-dev

创建主题文件

在src目录下创建theme-chalk、theme-light主题文件夹
在两个主题目录下创建index.useable.scss文件 

index.useable.scss中写入样式

  1. // theme-chalk/index.useable.scss
  2. body {
  3. background: red;
  4. }
  5. // theme-light/index.useable.scss
  6. body {
  7. background: green;
  8. }

到此,我们的主题样式都已经建好了,现在要将主题应用上去

在vue.config.js中增加style-loader/useable

vue-cli2根vue-cli3的配置区别还是挺大的,我在配置的过程中遇到很多坑,因为vue-cli3没有了webpack.config.js文件,我们在配置webpack的时候无法根据老文档来配置,需要熟悉cli3的webpack-chain来链式修改配置,但是文档很少,配置的过程中异常困难。

在配置文件中chainWebpack链式修改webpack配置就能成功应用loader了,话不多说,直接上代码,

  1. // 换肤loader
  2. const scss = config.module.rule('scss').toConfig();
  3. const useable = { ...scss.oneOf[3], test: /\.useable.scss$/ };
  4. useable.use = [...useable.use];
  5. useable.use[0] = { loader: 'style-loader/useable' };
  6. config.module.rule('scss').merge({ oneOf: [useable] });

使用主题

在准备工作都做好后,接下来我们开始使用主题样式。

之前说的为什么要用style-loader来做换肤呢?是因为style-loader提供了useable这一API,可动态加载删除link文件。具体详情请自行去看看style-loader。

在src目录下,创建theme.js文件

  1. const cache = {};
  2. const themeAction = {
  3. chalk() {
  4. if (!cache.chalk) {
  5. cache.chalk = import('./styles/theme-chalk/index.useable.scss');
  6. }
  7. return cache.chalk;
  8. },
  9. light() {
  10. if (!cache.light) {
  11. cache.light = import('./styles/theme-light/index.useable.scss');
  12. }
  13. return cache.light;
  14. }
  15. };
  16. let current = null;
  17. async function setTheme(theme) {
  18. if (themeAction[theme]) {
  19. const style = await themeAction[theme]();
  20. if (current) {
  21. current.unref();
  22. }
  23. style.ref();
  24. current = style;
  25. }
  26. }
  27. window.setTheme = setTheme;
  28. export default setTheme;

在main.js中,引入theme.js。

  1. import setTheme from './theme'
  2. // 使用主题
  3. setTheme('chalk')

重启服务,查看效果


在实际项目中,可根据传入的主题(chalk/light),动态切换主题色,同时也可根据业务需求,创建多个主题。我们只需要在index.useable.scss文件中写样式变量即可。

总结

以上所述是小编给大家介绍的基于webpack4+vue-cli3项目实现换肤功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对w3xue网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号