[ALOY-1685] Improve incremental build times
GitHub Issue | n/a |
---|---|
Type | Improvement |
Priority | None |
Status | Open |
Resolution | Unresolved |
Affected Version/s | n/a |
Fix Version/s | n/a |
Components | n/a |
Labels | n/a |
Reporter | Jan Vennemann |
Assignee | Jan Vennemann |
Created | 2019-05-02T14:25:23.000+0000 |
Updated | 2020-05-05T11:32:52.000+0000 |
Description
The "alloy compile" command is executed on every incremental build, even if no files change. This takes a huge amount of our total build time on incremental builds.
Implementing proper incremental build support to only process changed files would be a huge performance gain.
This is an absolute must have for Alloy to compete with modern app frameworks. We currently spend around 10-15s for each Alloy compile (only the compile, everything else comes on top) - even if no file changed. Alloy should have a simple file watcher that keeps hashes of every file and only compile them if the hash changed. There is even an [open pull request](https://github.com/appcelerator/alloy/pull/927) for this from one year ago but it seems to have been abandoned since then.
This can be implemented really easily with code that has been around since the early days of alloy. TiShadow has been using it for a long time to do fast updates. Basically just use a file watcher and then you can selectively compile alloy files. For example:
(Personally I use tishadow for all development, but you could create an independant alloy watcher module that would do this very easily.)
The reason that this is not integrated in the CLI build is that we can't fully rely on the usual NodeJS file watchers like chokidar, since a user can CTRL-C out of the build and then no changes would be tracked anymore. Before the user kicks off a new CLI build he may have edited a couple of other files that we are now unaware of so we would have to do a full Alloy build again. I tried to address this in https://github.com/appcelerator/alloy/pull/927 but unfortunately i never had the time to finish that. It only watches controllers/views, all other unnecessary processing Alloy does in incremental builds like copying a whole lot of unchanged files around is still happening. The same applies when using the existing
file
restriction flag to selectively compile controllers/views. In the meantime we started working on Webpack support, which will address almost all Alloy incremental build issues. It uses an approach similar to TiShadow, in that it will start a server in the background that keeps running Webpack in watch mode, which will make sure to compile changed files in between CLI builds. The new [alloy-loader](https://github.com/appcelerator/alloy-loader) processes changed controllers/views/styles. Webpack makes sure to only process changed files from other folders as well (likeapp/lib
orapp/vendor
). You can expect to see more of this new build pipeline in the next two weeks.Great! Thanks.