Repository navigation
[web_assets] Scaffold package - #3610
Conversation
dcharkes
left a comment
There was a problem hiding this comment.
For worker files (which in the cases I personally care about are compiled with dart compile js), we could detect which functionality provided by the worker is actually used by the client and then pass --define flags along with bool.fromEnvironment in the worker to disable entrypoints we know a client doesn't call.
Can you explain more about what worker files are and how they are different from things you directly call via js interop?
Do we need to tell the SDK that via a property on the asset or not? E.g. does the SDK need to bundle/link worker files differently?
Or is it more like code assets which can either be (1) dylibs you call directly via @Native() external or (2) that are opened by the dynamic linker at runtime.
For embedded JavaScript libraries, using recoded usages to perform tree-shaking is also attractive.
Yes, lets go! 🔥 That's why we designed the record-use to be used in link hooks and hooks to work with multiple asset types!
I think the PR should be labeled [infra] to make the PR checker happy.
Consider consider adding web_assets to the hooks_runner as dev_dependency and adding a test data project that emits web assets, and then exercising that in an integration test. Then we know you can write hooks that use this and we don't get surprises about it not working after we try to use it in dartdev.
Besides the question whether we should split js and wasm assets LGTM. Happy to land, let it roll into the Dart SDK so that we can work on a PR that wires it up in dart build web-bundle!
| "name": "assets/data_0.json", | ||
| "package": "simple_link" | ||
| }, | ||
| "type": "web_assets/web" |
There was a problem hiding this comment.
- For WebAssembly modules, we could detect which methods are actually called and invoke
wasm-metadceto remove unused functions.
I think we should distinguish different types of web assets maybe if we want the SDKs (Dart/Flutter/Jaspr/...) to treat different assets differently. (Looking at the file extension is not clean imo.)
- WASM can possibly be linked and tree-shaken
- WASMGC can possibly be linked and tree-shaken
- JS can possibly be minified
- images/sounds/icons/fonts -> I think these should be data assets and when Dart/Flutter encounter those with a web backend it should copy them to the right place. To make sure things work both in native backends and web backends transparently.
So, should we consider doing web_assets/js and web_assets/wasm (and potentially web_assets/wasmgc)? Then we enable ourselves to add properties that only apply to one of those types later.
(I know that will lead to duplicated code, but most of the schema/parsing is generated anyways.)
There was a problem hiding this comment.
I have renamed the asset type to WebUriAsset, so that we can add WebJsAsset and friends when needed.
Workers are basically the The main difference to interop with JS libraries is that workers can't be bundled directly into the main Dart program (there's is no equivalent of (of course, one can also represent JavaScript libraries by their URL at runtime and then import them, but I'd say that's a stopgap solution until we have proper JS library asset types) I don't think it makes sense to have an asset type specifically for workers as there are other web APIs identifying resources via URLs, and those would work in exactly the same way. URL assets are the most generic asset type for the web: Embedders are not allowed to alter their contents in any way. I agree with your suggestion of adding additional asset types that can be transformed (WASM, WASMGC, JS). I can rename the current URL asset to
An AssetBundle in Flutter (which I understand is where data assets currently end up in) doesn't expose URLs, so the assumption with data assets is that you'll only need to load them as a |
Is that something we should consider solving? Because if we solve it, you can run Dart code as a web worker, and if that Dart code happens to use js-interop and a js asset it's the same as all other JS interop.
To me that kind of sounds like data assets. If the contents are not altered in any way, no minifying, etc. However, Data assets can only be accessed by bytes right now, they are not guaranteed to have a file path on native or an url on web. And embedders might inline the bytes into the app if they see fit. So, if we then need a kind-of-data-asset-but-it-must-have-a-url on the web, then web_assets/web are those. And we would introduces web_assets/wasm and web_assets/js later. Maybe web_assets/data_url or web_assets/url would be better? And then Oh, I am basically retyping what you said without reading your full message 😄 that means we are on the same page! 👍 Then adding (Url assets basically give you the capability lazy load things on the web. Ditto we could have a |
04720bb to
19776f5
Compare
|
CI seems red. @simolus3 note to self:
|
ebbfc9f to
613e8ef
Compare
|
@dcharkes I have fixed the test failures, could you take another look? |
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## main #3610 +/- ##
========================================
Coverage 87.96% 87.97%
========================================
Files 307 311 +4
Lines 19662 19801 +139
========================================
+ Hits 17296 17419 +123
- Misses 2366 2382 +16
Flags with carried forward coverage won't be shown. Click here to find out more.
🚀 New features to boost your workflow:
|
@simolus3 did you use multiple email addresses? If yes they all need to sign the cla. 😅 Or just squash and reupload with 1 email address. Also, we've switched to codecov from coveralls, and apparently the default is now that you have to have a certain percentage covered. (It's easy to task an agent to write some extra tests. See my last 10 PRs on this repo 😆) |
613e8ef to
7a69e73
Compare
|
I've added a few more tests which should cover most of these files now. |
7a69e73 to
e56bcbe
Compare
Revisions updated by `dart tools/rev_sdk_deps.dart`. native (https://github.com/dart-lang/native/compare/f628b26..27f7678): 27f767827 Mon Sep 28 14:51:28 2026 +0200 Daco Harkes [hooks_runner] Remove `KernelAssets` and `Target` (dart-lang/native#3703) ddc7d6deb Mon Sep 28 05:40:03 2026 +0200 Jakob Kordež [ffigen] Skip typedefs to function pointers with unsupported parameter types (dart-lang/native#3694) 177d283d9 Mon Sep 28 04:30:28 2026 +0200 Jakob Kordež [ffigen] Generate bindings for C++ enums, structs and unions nested in namespaces and records (dart-lang/native#3644) 5ee8f67d8 Mon Sep 28 11:39:14 2026 +1000 Liam Appelbe [objective_c] Clarify block isolate scoping (dart-lang/native#3692) 25f090116 Fri Sep 25 12:09:12 2026 +1000 Liam Appelbe [ffigen][jnigen] Deprecate YAML config (dart-lang/native#3654) 8364413eb Fri Sep 25 10:09:50 2026 +1000 Liam Appelbe [jnigen] Document nullability (dart-lang/native#3690) e8d518574 Thu Sep 24 18:02:46 2026 +1000 Liam Appelbe [ffigen] Code snippet-ify ffigen and objective_c (dart-lang/native#3685) 663385955 Thu Sep 24 03:21:53 2026 +0300 Manar Elhabbal [ffigen] prevent setting both cpp and objectiveC in ffigenerator (dart-lang/native#3687) 1cf40952a Thu Sep 24 09:27:09 2026 +1000 Liam Appelbe [objective_c] Remove arm64e build hack (dart-lang/native#3680) c44550b6e Wed Sep 23 13:01:33 2026 +0200 Simon Binder [web_assets] Scaffold package (dart-lang/native#3610) 57b4bad69 Wed Sep 23 16:21:27 2026 +1000 Liam Appelbe [swift2objc] Code snippet-ify swift2objc (dart-lang/native#3684) 5cee1d0be Wed Sep 23 10:16:29 2026 +0530 Rachit Vikram Singh [ffigen] Add Input.appendCompilerOptions to append clang args to defaults (`#3630`) (dart-lang/native#3676) 225a648df Wed Sep 23 14:37:13 2026 +1000 Liam Appelbe [jnigen] Code snippet-ify jnigen and co (dart-lang/native#3641) 2030decf9 Wed Sep 23 13:51:24 2026 +1000 Liam Appelbe [infra] Move snippets_tool to its own package (dart-lang/native#3683) 6fa2beea2 Wed Sep 23 12:14:28 2026 +1000 Liam Appelbe [objective_c] Revert `#3664` (dart-lang/native#3681) ed7605f8a Tue Sep 22 12:03:22 2026 +0530 Sivapriya [jni] Add deep conversion utils (dart-lang/native#3635) 8574b7422 Tue Sep 22 08:31:11 2026 +0200 Lukas Klingsbo [ffigen] Allow package:cli_util 0.5.x and 0.6.x (dart-lang/native#3673) test (https://github.com/dart-lang/test/compare/9946c95..4f92d53): 4f92d530 Fri Sep 25 16:46:22 2026 -0700 Nate Bosch Unskip a test on windows (dart-lang/test#2772) 7fb84866 Fri Sep 25 14:52:39 2026 -0700 Nate Bosch Bundle skips at the end of the GitHub reporter (dart-lang/test#2768) 603e5ec5 Thu Sep 24 14:00:41 2026 -0700 Nate Bosch Clean up the runner's temporary directories (dart-lang/test#2763) 4bf04d90 Thu Sep 24 12:41:15 2026 -0700 Nate Bosch Refactor signal handling in executable.dart (dart-lang/test#2765) 2c660a84 Tue Sep 22 15:33:34 2026 -0700 Nate Bosch Regenerate mono_repo output (dart-lang/test#2767) tools (https://github.com/dart-lang/tools/compare/3614ce0..d87eaf7): d87eaf79 Thu Sep 24 08:31:33 2026 -0700 Kevin Moore fix(benchmark_harness): migrate subprocess spawning to package:cli_util (dart-lang/tools#2585) 8ccf8ccf Wed Sep 23 05:09:10 2026 +0530 Aman Maurya [string_scanner] Extract a mixin for LineScanner and deduplicate eager scanning logic (dart-lang/tools#2569) afcdd6d9 Tue Sep 22 15:38:07 2026 +0200 Morgan :) Document that watch events converge on filesystem state. (dart-lang/tools#2607) f2157cbc Tue Sep 22 04:52:58 2026 +0300 Hasan Armoush [code_builder] Add null-aware cascades, cascade index, and fluent cascade helpers (dart-lang/tools#2540) web (https://github.com/dart-lang/web/compare/e5c6c02..ec71a4c): ec71a4c Mon Sep 28 10:07:01 2026 -0700 Kevin Moore [js_interop_gen] Require `code_builder: ^4.12.0` and update golden headers (dart-lang/web#576) [email protected] Change-Id: I766bc5b2b1297e3251990821bb73387ba685e39b Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/556320 Commit-Queue: Nate Bosch <[email protected]> Reviewed-by: Brian Quinlan <[email protected]>
Description
This introduces
package:web_assetsas a first step towards #988. Web assets are very similar to data assets (and the package is admittedly mostly a copy), but specific to the web and only exposed as a URI. This is their main difference to data assets, which will be exposed as a string or byte array. In other words,web_assetsare assets a Dart web developer would otherwise have to copy into theirweb/directory as static files.The linked issue contains plenty of motivation, but I want to share two examples for which I want to use this asset type:
package:sqlite3has web support, and requires a build of sqlite compiled for the web. Currently, users have to manually download asqlite3.wasmfrom my GitHub release page into theirweb/directory to use that package on the web. An asset that can be resolved to a URI at runtime would be a perfect fit for this. Note that this is not the same as a code asset with a "wasm ABI", I also need this to work withdart compile js.package:drift,package:sqlite3_webandpackage:powersyncall use web workers to offload database queries onto a background thread and to access file system APIs that unavailable in tabs. Again, users need to download these files manually when these should obviously be contributed by a hook.dart:js_interopmight want to provide its JS bundle somehow, hooks are again a great fit for this.Finally, I think the mechanism of link hooks is also very interesting here:
wasm-metadceto remove unused functions.dart compile js), we could detect which functionality provided by the worker is actually used by the client and then pass--defineflags along withbool.fromEnvironmentin the worker to disable entrypoints we know a client doesn't call.Related Issues
Related to #988
PR Checklist
dart tool/ci.dart --alllocally and resolved all issues identified. This ensures the PR is formatted, has no lint errors, and ran all code generators. This applies to the packages part of the toplevelpubspec.yamlworkspace.CHANGELOG.mdfor the relevant packages. (Not needed for small changes such as doc typos).