让你的 weex 项目编译速度提升 95%

简介: 背景   使用 weex-toolkit 作为脚手架新建 weex 的项目,在项目规模越来越大是,每一次修改文件,编译会越来越慢。answer 这个项目 vue 组件众多 (30+),每次即便一个组件的文案修改,也会长达 30s 的时间。观察到,用时最多的时间在  asset optimization 上   在 google 搜了下,发现也有同学

背景

 
使用 weex-toolkit 作为脚手架新建 weex 的项目,在项目规模越来越大是,每一次修改文件,编译会越来越慢。answer 这个项目 vue 组件众多 (30+),每次即便一个组件的文案修改,也会长达 30s 的时间。观察到,用时最多的时间在  asset optimization 上
 
在 google 搜了下,发现也有同学遇到了相同的问题: https://github.com/weexteam/weex-toolkit/issues/315
 

分析

 
难道我们修改一个文件,所有文件的编译都要走一遍?通过 webpack 输出的信息并不是这样
 
 
修改一个文件,只有一个 vue 做了编译,速度很快,和  asset optimization 没有多大关系,那问题可能会出现在哪里?
 
weex 脚手架提供的是多页开发的方式,会给每一个 vue 文件都是一个 entry,都会生成对应的 html 去预览这个组件。
 
const getEntryFile = (dir) => {
  dir = dir || '.';
  const directory = helper.root(dir);
  fs.readdirSync(directory).forEach((file) => {
    const fullpath = path.join(directory, file);
    const stat = fs.statSync(fullpath);
    const extname = path.extname(fullpath);
    if (stat.isFile() && extname === '.vue') {
      const name = path.join(dir, path.basename(file, extname));
      if (extname === '.vue') {
        const entryFile = path.join(vueWebTemp, dir, path.basename(file, extname) + '.js');
        fs.outputFileSync(entryFile, getEntryFileContent(entryFile, fullpath));
        webEntry[name] = entryFile;
      }
      weexEntry[name] = fullpath + '?entry=true';
    }
    else if (stat.isDirectory() && file !== 'build' && file !== 'include') {
      const subdir = path.join(dir, file);
      getEntryFile(subdir);
    }
  });
}
 
在 preview.html 页面上,也可以切换不同的 button 去预览不同的组件。
 
 
会不会是时间大多数时间都耗费在这上面呢?
 
在排查的过程中,这个帖子引起了我的注意 https://www.v2ex.com/t/419797
 
8396ms asset optimization
95% emitting
 
大多数时间都花在了 asset optimization 上,下面也提出, https://github.com/mzgoddard/hard-source-webpack-plugin 做了优化
 
和 html-webpack-plugin 的 diff:
 
 
大概思路就是设置一个变量,如果这个之前编译过,为 true,如果有修改其为 false。当 true 的时候跳过再次编译。
在项目中试了一下,果然提升了很大。
 
优化前:
 
 
优化后:
 
 
总的编译时间提升了 95%,罪魁祸首应该就是这个了。
 
给 weex 的 webpack 模板提交了个PR https://github.com/weex-templates/webpack/pull/5,大家用最新版不会遇到编译时间长的问题了。
 

反思

 
  1. 直接另外开一个库去加这个功能,很难做到和父库的同步,这样很难去做以后的升级(比如要升级到 webpack@4)
  2. 给所有 vue 组件都生成 html ,这种方式到底好不好呢?多页的这个页我觉得不应该是按照组件去划分,而是规范一下,只有 src 一级目录下的 vue 才是入口?这样最多也没几个,速度也不会慢下来
  3. 如果想更快点,也可以加上 https://github.com/mzgoddard/hard-source-webpack-plugin 这个插件,会把之前编译的结果缓存到硬盘里,如果重复的就不会重新去编译了
目录
相关文章
|
移动开发 weex
《Weex项目&阿里移动技术开源方向》电子版地址
Weex项目&阿里移动技术开源方向
127 0
《Weex项目&阿里移动技术开源方向》电子版地址
|
移动开发 JavaScript weex
Weex项目初始化weex-iOS集成
项目初始化 1、没有现成的工程的话新建iOS项目 命令行cd到项目根目录 执行 pod init,会创建一个pod配置文件 用编辑器打开,加上 pod 'WeexSDK', :path=>'.
955 0
|
移动开发 JavaScript weex
Weex项目与阿里移动技术开源
本文PPT来自淘宝移动平台天施于10月14日在2016年杭州云栖大会上发表的演讲,分享主题为《Weex项目&阿里移动技术开源方向》。
5386 0
|
移动开发 weex
不止是动态化:Weex项目和阿里无线技术开源方向
阿里巴巴淘宝移动平台资深无线技术专家天施在杭州云栖大会期间分享了Weex项目介绍、起源与现状、Weex开源与社区,以及阿里移动技术开源。
3731 0
|
6月前
|
移动开发 前端开发 JavaScript
探究移动端混合开发技术:React Native、Weex、Flutter的比较与选择
移动端混合开发技术在移动应用开发领域日益流行,为开发者提供了更高效的跨平台开发方案。本文将比较三种主流混合开发技术:React Native、Weex和Flutter,从性能、生态系统和开发体验等方面进行评估,以帮助开发者在选择适合自己项目的技术时做出明智的决策。
393 2
|
6月前
|
移动开发 前端开发 weex
移动端混合开发技术:React Native、Weex、Flutter 之争
在移动应用开发领域,React Native、Weex 和 Flutter 是备受关注的混合开发技术。本文将对它们进行全面比较与评估,以帮助开发者做出明智的选择。我们将从开发生态、性能、跨平台能力和易用性等方面进行比较,为读者提供全面的参考和指导。
|
6月前
|
移动开发 Dart 前端开发
移动端混合开发技术:React Native、Weex、Flutter的比较与选择
移动应用的开发已经成为现代社会中的重要一环。本文将比较并评估三种主流的移动端混合开发技术:React Native、Weex和Flutter。通过对它们的特点、优势和劣势的分析,帮助开发者在选择适合自己项目的技术方案时做出明智的决策。
|
6月前
|
移动开发 开发框架 前端开发
移动端混合开发技术探析:React Native、Weex、Flutter的比较与选择
随着移动应用开发的高速发展,混合开发技术成为了一种备受关注的选择。本文将对移动端混合开发技术中的React Native、Weex和Flutter进行比较与探讨,分析它们在性能、开发体验、生态系统和跨平台支持等方面的差异,以及如何根据项目需求进行选择。
212 1
|
移动开发 JSON JavaScript
weex开发 - VS Code解除格式警告
weex开发 - VS Code解除格式警告
118 0
weex开发 - VS Code解除格式警告
|
移动开发 JavaScript weex
weex开发- 无法找到模块“weex-vue-render”的声明文件。引入vue报错,无法找到引入的vue模块
weex开发- 无法找到模块“weex-vue-render”的声明文件。引入vue报错,无法找到引入的vue模块
306 0
weex开发- 无法找到模块“weex-vue-render”的声明文件。引入vue报错,无法找到引入的vue模块