blog icon indicating copy to clipboard operation
blog copied to clipboard

使用 gulp-rev-all 来解决 RequireJS 的增量更新问题

Open lmk123 opened this issue 10 years ago • 11 comments

这两天陆续学习了下 gulpf.i.s。学习 gulp 纯粹是好奇它为什么会比 grunt 流行(我的结论在 #3),而学习 fis 则是为了解决一个_“前端工程”_问题。

我基于一些原因(见 #2),在公司项目里使用了 RequireJS,但我仍需要解决它的增量更新问题。单靠 RequireJS 提供的 urlArgs 是远远不够的,最好的办法应该是这篇文章里所说的那样,给每个静态文件的文件名加上 md5。

在我思考要不要脱离 fis、自己来实现的时候,我在网上搜到了一个 gulp 插件:gulp-rev-all。比起 fis 那种通过更新 RequireJS 中的 paths 设置,这个插件做的事情更符合我的意愿。它能把下面的代码:

requrie(['libs/doT'],function (d) {
    // ...
});

转换成:

requrie(['libs/doT.dfe5trf3'],function (d) {
    // ...
});

也就是说,它在给所有文件添加 hash 的同时,还会更改引用过这些文件的地方,无论是 css 里面的图片,还是 js 里面引用的模块:这样就不需要额外加载映射表了。毕竟随着项目的增长,映射表可能会变得越来越庞大。

真是踏破铁鞋无觅处,得来全不费工夫。- -

这种方式仍然有需要注意的地方:如果项目是前后端分离的,那么服务端的模板里面不应该有调用 requrie(['deps']) 的 inline script;如果不是,那就将后端模板也纳入插件的处理范围,当然这样做有点……怎么说呢,low。

那么,关于前端工程的研究总算能告一段落了。最好能做一个 demo 出来。

lmk123 avatar Feb 06 '15 07:02 lmk123

最近折腾requirejs,也遇到同样的问题。

看来引入另外的工具是必不可少了。

刚刚折腾了下,没有达到目的。期待demo~。~

SiZapPaaiGwat avatar Feb 13 '15 09:02 SiZapPaaiGwat

@simongfxu 好的,年后我就整一个demo出来- -

lmk123 avatar Feb 13 '15 16:02 lmk123

@simongfxu 我在这个项目里用了 requirejs + gulp-rev-allgh-pages 分支里就是加过 md5 之后的文件。你看看 gulpfile.js 就大致了解该怎么用了。希望还不算迟。- -

lmk123 avatar Apr 12 '15 13:04 lmk123

thanks,有空看下。

我后来用自己的方法实现了,没有使用gulp或者grunt等,就是自己写脚本配合r.js强大的功能。

本质还是维护映射表,但是这个映射表不会变的很大。因为个人觉得一个项目脚本数目最多的肯定还是业务类,现在我习惯于把所有的业务脚本合并打包压缩。最后我发现就算我的业务量增加到目前的八倍左右,我的业务脚本刚好和我使用的第三方基础库的大小一样(合并后)。

再加上上周刚刚把业务类的组件封装了一遍(之前写的都是通用组件),发现业务类脚本代码量又可以减少三分之一到二分之一,感谢MVVM!

SiZapPaaiGwat avatar Apr 13 '15 01:04 SiZapPaaiGwat

urlArgs也是可以的。之前用requirejs的时候也是为了解决增量更新的问题折腾了好一翻,那时没发现有gulp-rev-all,最后的解决方案是修改requirejs的源码,把urlArgs改成一个function。最终结果肯定是没有修改文件名那样完美,也是一种可行的选择。具体可看下我之前写的文章。http://segmentfault.com/a/1190000000761578

hellopao avatar Apr 22 '15 01:04 hellopao

@hellopao 你看到你这篇文章第一条(或者说唯一的那条)评论没有?那就是我留下的 :) 我很早就看过了,只是我个人不太喜欢修改第三方脚本的源码,所以没有采用 :)

lmk123 avatar Apr 22 '15 02:04 lmk123

使用 gulp-rev-all 确实可以递归查找以来并计算 hash 值。但也存在风险,比如公共部分的模块修改了,因为递归查找以来并计算 hash 的原理,会导致几乎全局的 js 的 hash 会重新计算一遍。在这种情况下达不到增量更新的效果。觉得使用 paths 来说可能会更加合理一些。当然由于频繁更新的问题,会导致资源映射表也常常更新,我觉得可以将这部分两大块,一部分是不常更新的列表,一部分是经常变动的~~

Hanruis avatar Jan 13 '16 11:01 Hanruis

@Hanruis 是有风险的,好在 Webpack 及时出现,所以我已经弃用 gulp-rev-all 了。

lmk123 avatar Jan 13 '16 11:01 lmk123

soga,因为不了解 webpack 。可以介绍一些 webpack 对于这一块处理的思路么~

Hanruis avatar Jan 13 '16 11:01 Hanruis

Webpack 既支持按需加载,又支持根据内容将文件重命名为 hash,不需要有思路,简单的配置一下就可以了:

Code Splitting(按需加载) Long-term Caching(hash 文件名)

lmk123 avatar Jan 13 '16 11:01 lmk123

谢谢,刚也看了相关的文章介绍 看了下相关的文章介绍,webpack 增量更新的思路貌似也是通过内置的一个资源表实现。

Hanruis avatar Jan 13 '16 11:01 Hanruis