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

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

背景

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

分析

 
难道我们修改一个文件,所有文件的编译都要走一遍?通过 webpack 输出的信息并不是这样
 
1535944095223-33a46f8e-5bbc-4b46-b848-66
 
修改一个文件,只有一个 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 去预览不同的组件。
 
1535944420092-7d50bb1e-c86a-4810-9405-37
 
会不会是时间大多数时间都耗费在这上面呢?
 
在排查的过程中,这个帖子引起了我的注意 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 的时候跳过再次编译。
在项目中试了一下,果然提升了很大。
 
优化前:
 
1535945751121-989bfb38-4cae-450c-a395-f7
 
优化后:
 
1535945767686-6a1eec48-779d-41df-8798-dd
 
总的编译时间提升了 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
|
移动开发 JavaScript weex
Weex项目初始化weex-iOS集成
项目初始化 1、没有现成的工程的话新建iOS项目 命令行cd到项目根目录 执行 pod init,会创建一个pod配置文件 用编辑器打开,加上 pod 'WeexSDK', :path=>'.
931 0
|
移动开发 JavaScript weex
Weex项目与阿里移动技术开源
本文PPT来自淘宝移动平台天施于10月14日在2016年杭州云栖大会上发表的演讲,分享主题为《Weex项目&阿里移动技术开源方向》。
5350 0
|
移动开发 weex
不止是动态化:Weex项目和阿里无线技术开源方向
阿里巴巴淘宝移动平台资深无线技术专家天施在杭州云栖大会期间分享了Weex项目介绍、起源与现状、Weex开源与社区,以及阿里移动技术开源。
3658 0
|
移动开发 JSON JavaScript
weex开发 - VS Code解除格式警告
weex开发 - VS Code解除格式警告
74 0
weex开发 - VS Code解除格式警告
|
weex-ui 移动开发 JavaScript
weex开发-使用weex-ui绑定事件源注意事项
weex开发-使用weex-ui绑定事件源注意事项
118 0
|
移动开发 JavaScript weex
weex开发 - 方法的映射,在weex调用fetch方法,实际调用同名的原生方法,在回调中把数据传递回js
weex开发 - 方法的映射,在weex调用fetch方法,实际调用同名的原生方法,在回调中把数据传递回js
170 0
|
移动开发 编解码 weex
weex开发 - 加载index.js崩溃,白屏(may it has been destroyed so method:fireEvent is ignored,Url must be passe)
weex开发 - 加载index.js崩溃,白屏(may it has been destroyed so method:fireEvent is ignored,Url must be passe)
261 0
|
移动开发 JavaScript weex
weex开发- 无法找到模块“weex-vue-render”的声明文件。引入vue报错,无法找到引入的vue模块
weex开发- 无法找到模块“weex-vue-render”的声明文件。引入vue报错,无法找到引入的vue模块
258 0
weex开发- 无法找到模块“weex-vue-render”的声明文件。引入vue报错,无法找到引入的vue模块
|
移动开发 前端开发 rax
weex开发android应用
weex使用简要介绍
427 0
weex开发android应用