臃肿项目优化

前言

在项目开发的过程中对项目做过一些优化,例如对项目结构、模块划分做了明确的定义。但是,项目打包后的体积却依然有78M、编译需要30-60S(电脑都要跑爆炸)、多个庞大模块混杂在一个项目当中。下面就来说说优化的点吧。。

常规优化

体积

从打包后的文件大小来看,图片等资源30+Mjs部分30+M,这些文件的大小实在是惊人,所以有了以下的操作:

1、 静态资源迁移oss

明明有oss静态服务器,前端同学也没有用起来(匪夷所思),然后就把图片、字体等资源迁移到了oss,然后删除了一部分没有在使用的资源(体力活,大概率不会有人来做了)

2、 webpack-bundle-analyzer

资源处理完了,使用webpack-bundle-analyzer分析一下js部分,大量插件被打包编译,占了相当大一部分体积,将部分大且不经常变动插件vuevuexelement-uivue-routermoment改用cdn引入并配置externals

3、 关闭sourceMap

4、部分大型json类文件

从打包结果分析来看,一个js文件有500+KB,一看是关于地区的json数据

这样处理完毕包大概还有个6+m,没有处理的有echartslodash等,由于项目中有大量的按需引入,即使配置了externals也没用,时间也不允许(毕竟抽空做一点是一点),即使如此包也已经缩小了十倍

编译时间

常规编译时间优化,基本都是配置webpack排除对一些文件的编译,缓存编译、多进程编译等等,插件有hard-source-webpack-pluginbabel-plugin-dynamic-import-nodehappypack等等一系列插件,我也都做了尝试,有些许作用,但是我还是低估了项目的骨灰级程度,即使有了缓存、多进程也需要10+s,但这基本就是常规的编译速度的优化,还有一些小小的建议

1、 避免在入口文件大量引入资源

2、 尽量少的注册全局状态 & 方法

3、 尽量封装、少些无用代码逻辑

按需编译

说完了常规的,一起了解一下按需编译,项目开发有一些公共模块和无数个独立的依赖公共部分的模块

假设:

公共模块 = main.js + plugins + store + router + 组件

那么:

模块A = 公共模块 + aPlugins + aStore + aRouter + a组件

模块B = 公共模块 + bPlugins + bStore + bRouter + b组件
复制代码

如果开发A模块时可以只编译和A模块相关的内容,那编译速度将会非常的快,以我目前正在优化的项目,编译时间由40+s缩短到了5s,相当可观

但从描述上来讲按需编译可以看到多页面微前端的影子,但是成本是非常高的、技术方案相对比较重,同时需要团队给予充分的时间、团队成员也需要一定的技术能力,今天在分享一下按需编译这个方案,目录结构如下

test
├── src
│   ├── main.js
│   ├── register.js
├── modules
│   ├── A
│   │  ├── store.js
│   │  ├── router.js
│   │  ├── index.js
│   ├── B
│   │  ├── store.js
│   │  ├── router.js
│   │  ├── index.js

复制代码
// A - index.js
import Router from './router';
import Store from './store'

export default {
    router: Router,
    store: Store
};
// B - index.js
import Router from './router';
import Store from './store'

export default {
    router: Router,
    store: Store
};
复制代码

指定编译模块

webpack-virtual-modules可以帮助生产虚拟模块,然后根据环境变量通过require.context动态引入需要的模块

// vue.config.js
// 借助webpack-virtual-modules生成虚拟模块
const VirtualModulesPlugin = require('webpack-virtual-modules');
// 编译模块
const modules = process.env.npm_config_module || '';
// 是否是本地模块编译
const isModule = modules && process.env.NODE_ENV === 'development'
// 返回模块虚拟
let buildModules = [];
if (isModule) {
    buildModules = modules.split(',').map((module, index) => `require.context("../modules/${module}", false, /index\.js$/)`);
}
module.exports = {
  configureWebpack: {
    plugins: [
      // 创建虚拟模块
      new VirtualModulesPlugin({
          'node_modules/dynamic-modules.js': `module.exports = [${buildModules.join(',')}];`
      });
    ]
  }
}
复制代码

动态添加信息

// test.js
export default (vue) => {
    //  获取虚拟模块数据
    let modules = require('dynamic-modules');
    // 遍历
    for (const curModule of modules) {
        curModule.keys().map(key => {
            // 解析module
            const { router, store } = curModule(key).default;
            Object.keys(store).map(key => {
                // 动态添加store
                vue.$store.registerModule(key, store[key]);
            });
            // 动态添加router
            vue.$router.addRoutes(router);
        });
    }
}
// 在main.test.js
// mai.js
import test from './test'
const app = new Vue({ ... })
test(app)
复制代码

此时当我们执行npm run serve --module=A时,只会引入A模块相关的信息,B模块则不会进行编译

这个方案更适合一些臃肿项目的优化,时间、人力、技术要求成本均相对较低

优点:成本低,改造快
缺点:针对本地开发

所以,有时间的话,还是进行一下微服务的尝试

结语

神清气爽

参考:
Webpack externals

「vue模块化按需编译,突破编译瓶颈」实战篇

用 Feature First 的方式管理前端项目复杂度

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,552评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,666评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,519评论 0 334
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,180评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,205评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,344评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,781评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,449评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,635评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,467评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,515评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,217评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,775评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,851评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,084评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,637评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,204评论 2 341

推荐阅读更多精彩内容