Skip to content

Commit 2112322

Browse files
committed
Add TodoMVC for dart2js & dart2wasm
This is a Jaspr Dart Web TodoMVC app compiled with dart2js and dart2wasm. We compile with * dart2js in unsound (-O4) mode * dart2wasm in sound (-O2) mode as those are the default settings in e.g. flutter tooling. To remember this difference we specify the optimization mode in the benchmark name. The app can be compiled by installing the Dart SDK and running ``` % ./build.sh |& tee build.log ... ```
1 parent bb9e3e1 commit 2112322

27 files changed

+7866
-0
lines changed

resources/tests.mjs

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -853,6 +853,66 @@ Suites.push({
853853
],
854854
});
855855

856+
Suites.push({
857+
name: "TodoMVC-Jaspr-Dart2JS-O4",
858+
url: "resources/todomvc/dart-jaspr-todomvc/out-dart2js-O4/index.html",
859+
tags: ["todomvc", "experimental"],
860+
disabled: true,
861+
async prepare(page) {
862+
(await page.waitForElement(".new-todo")).focus();
863+
},
864+
tests: [
865+
new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => {
866+
const newTodo = page.querySelector(".new-todo");
867+
for (let i = 0; i < numberOfItemsToAdd; i++) {
868+
newTodo.setValue(getTodoText("ja", i));
869+
newTodo.dispatchEvent("change");
870+
newTodo.enter("keypress");
871+
}
872+
}),
873+
new BenchmarkTestStep("CompletingAllItems", (page) => {
874+
const checkboxes = page.querySelectorAll(".toggle");
875+
for (let i = 0; i < numberOfItemsToAdd; i++)
876+
checkboxes[i].click();
877+
}),
878+
new BenchmarkTestStep("DeletingAllItems", (page) => {
879+
const deleteButtons = page.querySelectorAll(".destroy");
880+
for (let i = numberOfItemsToAdd - 1; i >= 0; i--)
881+
deleteButtons[i].click();
882+
}),
883+
],
884+
});
885+
886+
Suites.push({
887+
name: "TodoMVC-Jaspr-Dart2Wasm-O2",
888+
url: "resources/todomvc/dart-jaspr-todomvc/out-dart2wasm-O2/index.html",
889+
tags: ["todomvc", "experimental"],
890+
disabled: true,
891+
async prepare(page) {
892+
(await page.waitForElement(".new-todo")).focus();
893+
},
894+
tests: [
895+
new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => {
896+
const newTodo = page.querySelector(".new-todo");
897+
for (let i = 0; i < numberOfItemsToAdd; i++) {
898+
newTodo.setValue(getTodoText("ja", i));
899+
newTodo.dispatchEvent("change");
900+
newTodo.enter("keypress");
901+
}
902+
}),
903+
new BenchmarkTestStep("CompletingAllItems", (page) => {
904+
const checkboxes = page.querySelectorAll(".toggle");
905+
for (let i = 0; i < numberOfItemsToAdd; i++)
906+
checkboxes[i].click();
907+
}),
908+
new BenchmarkTestStep("DeletingAllItems", (page) => {
909+
const deleteButtons = page.querySelectorAll(".destroy");
910+
for (let i = numberOfItemsToAdd - 1; i >= 0; i--)
911+
deleteButtons[i].click();
912+
}),
913+
],
914+
});
915+
856916
Suites.push({
857917
name: "NewsSite-Next",
858918
url: "resources/newssite/news-next/dist/index.html",
@@ -1113,6 +1173,7 @@ Suites.push({
11131173
],
11141174
});
11151175

1176+
11161177
Object.freeze(Suites);
11171178
Suites.forEach((suite) => {
11181179
if (!suite.tags)
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
.dart_tool/
2+
build/
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# todomvc
2+
3+
A Jaspr implementation of todomvc, written in Dart and compilable to either JavaScript or WebAssembly.
4+
5+
## Setup
6+
7+
Install [dart](https://dart.dev/get-dart).
8+
9+
## Running the project
10+
11+
Run your project using `dart run jaspr_cli:jaspr serve`.
12+
13+
The development server will be available on `http://localhost:8080`.
14+
15+
## Building the project
16+
17+
Build your project using either:
18+
- Generate JavaScript via: `jaspr build -O4 --extra-js-compiler-option=--no-minify`
19+
- Generate WebAssembly via: `jaspr build -O4 --experimental-wasm --extra-wasm-compiler-option=--no-strip-wasm`
20+
21+
The output will be located inside the `build/jaspr/` directory.
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
include: package:lints/recommended.yaml
2+
3+
analyzer:
4+
# Jaspr has a custom lint package 'jaspr_lints', which needs the 'custom_lint' analyzer plugin.
5+
#
6+
# Unfortunately, running 'dart analyze' does not pick up the custom lints. Instead, you need to
7+
# run a separate command for this: `jaspr analyze`
8+
plugins:
9+
- custom_lint

resources/todomvc/dart-jaspr-todomvc/build.log

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
+ set -e
2+
+ echo 'Current Dart SDK version'
3+
Current Dart SDK version
4+
+ dart --version
5+
Dart SDK version: 3.9.0-edge.df9e0f97298b4e64d18f347d1a95903c399a2efe (main) (Mon May 5 03:19:20 2025 -0700) on "macos_arm64"
6+
+ echo 'Fetching dependencies'
7+
Fetching dependencies
8+
+ dart pub get
9+
Resolving dependencies...
10+
Downloading packages...
11+
_fe_analyzer_shared 80.0.0 (82.0.0 available)
12+
analyzer 7.3.0 (7.4.4 available)
13+
analyzer_plugin 0.12.0 (0.13.0 available)
14+
custom_lint 0.7.3 (0.7.5 available)
15+
custom_lint_builder 0.7.3 (0.7.5 available)
16+
custom_lint_core 0.7.1 (0.7.5 available)
17+
dds 4.2.7 (5.0.0 available)
18+
devtools_shared 10.0.2 (11.2.0 available)
19+
dwds 24.3.5 (24.3.10 available)
20+
freezed_annotation 2.4.4 (3.0.0 available)
21+
json_rpc_2 3.0.3 (4.0.0 available)
22+
mime 1.0.6 (2.0.0 available)
23+
shelf_web_socket 2.0.1 (3.0.0 available)
24+
vm_service 14.3.1 (15.0.0 available)
25+
web 1.1.0 (1.1.1 available)
26+
Got dependencies!
27+
15 packages have newer versions incompatible with dependency constraints.
28+
Try `dart pub outdated` for more information.
29+
+ echo 'Building dart2js version in -O4'
30+
Building dart2js version in -O4
31+
+ rm -rf build out-dart2js-O4
32+
+ dart run jaspr_cli:jaspr build -O4 --extra-js-compiler-option=--disable-program-split
33+
Building jaspr for client rendering mode.
34+
⠋ Building web assets......⠙ Building web assets...... (0ms)✓ Completed building web assets. (15.5s)
35+
Completed building project to /build/jaspr.
36+
+ mkdir out-dart2js-O4
37+
+ cp build/jaspr/index.html build/jaspr/base.css build/jaspr/index.css build/jaspr/favicon.ico build/jaspr/main.dart.js out-dart2js-O4
38+
+ echo 'Building dart2js version in -O4'
39+
Building dart2js version in -O4
40+
+ rm -rf build out-dart2wasm-O2
41+
+ dart run jaspr_cli:jaspr build -O2 --experimental-wasm
42+
Building jaspr for client rendering mode.
43+
⠋ Building web assets......⠙ Building web assets...... (0ms)✓ Completed building web assets. (10.9s)
44+
Completed building project to /build/jaspr.
45+
+ mkdir out-dart2wasm-O2
46+
+ cp build/jaspr/index.html build/jaspr/base.css build/jaspr/index.css build/jaspr/favicon.ico build/jaspr/main.dart.js build/jaspr/main.mjs build/jaspr/main.wasm out-dart2wasm-O2
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
#!/bin/bash
2+
3+
JS_OUT=out-dart2js-O4
4+
WASM_OUT=out-dart2wasm-O2
5+
6+
set -x
7+
set -e
8+
9+
echo "Current Dart SDK version"
10+
dart --version
11+
12+
echo "Fetching dependencies"
13+
dart pub get
14+
15+
# NOTE: For profiling add the following argument to get symbols
16+
# --extra-js-compiler-option=--no-minify
17+
echo "Building dart2js version in -O4"
18+
rm -rf build $JS_OUT
19+
dart run jaspr_cli:jaspr build -O4 --extra-js-compiler-option=--disable-program-split
20+
mkdir $JS_OUT
21+
cp build/jaspr/{index.html,base.css,index.css,favicon.ico,main.dart.js} $JS_OUT
22+
23+
# NOTE: For profiling add the following argument to get symbols
24+
# --extra-wasm-compiler-option=--no-strip-wasm
25+
echo "Building dart2js version in -O4"
26+
rm -rf build $WASM_OUT
27+
dart run jaspr_cli:jaspr build -O2 --experimental-wasm
28+
mkdir $WASM_OUT
29+
cp build/jaspr/{index.html,base.css,index.css,favicon.ico,main.dart.js,main.mjs,main.wasm} $WASM_OUT
30+
31+
# Server started on port 8080
32+
# 2025-05-05T14:32:04.223772 0:00:00.007537 GET [200] /
33+
# 2025-05-05T14:32:04.354763 0:00:00.000403 GET [200] /base.css
34+
# 2025-05-05T14:32:04.355587 0:00:00.000169 GET [200] /index.css
35+
# 2025-05-05T14:32:04.356197 0:00:00.000163 GET [200] /main.dart.js
36+
# 2025-05-05T14:32:04.360326 0:00:00.000404 GET [200] /main.mjs
37+
# 2025-05-05T14:32:04.412273 0:00:00.000742 GET [200] /main.wasm
38+
39+
40+
# 2025-05-05T14:32:49.819110 0:00:00.006053 GET [200] /
41+
# 2025-05-05T14:32:49.840887 0:00:00.000380 GET [200] /base.css
42+
# 2025-05-05T14:32:49.841675 0:00:00.000132 GET [200] /index.css
43+
# 2025-05-05T14:32:49.842226 0:00:00.000123 GET [200] /main.dart.js
44+
# 2025-05-05T14:32:49.871620 0:00:00.000226 GET [200] /favicon.ico
45+
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import 'package:jaspr/jaspr.dart';
2+
import 'components/todomvc.dart';
3+
4+
class App extends StatelessComponent {
5+
const App({super.key});
6+
7+
@override
8+
Iterable<Component> build(BuildContext context) => [
9+
TodoMVC(),
10+
footer(classes: 'info', [
11+
p([text('Double-click to edit a todo')]),
12+
p([text('Created by the Dart team')]),
13+
p([
14+
text('Part of '),
15+
a(href: 'http://todomvc.com', [text('TodoMVC')])
16+
]),
17+
]),
18+
];
19+
}

0 commit comments

Comments
 (0)