From 322908145e7948c70903aacb25f17e1103299ac1 Mon Sep 17 00:00:00 2001 From: Valerio Ageno Date: Thu, 23 May 2024 22:02:50 +0200 Subject: [PATCH] feat: create dev scripts --- crates/bundler/src/bundler.rs | 53 +++++++++++++++++---------- crates/cli/src/actions/dev.rs | 20 +---------- crates/tuono_lib/src/ssr.rs | 2 +- packages/tuono/bin/build-prod.js | 5 +++ packages/tuono/bin/dev-ssr.js | 5 +++ packages/tuono/bin/watch.js | 5 +++ packages/tuono/package.json | 22 ++++++++++-- packages/tuono/src/build/index.ts | 60 +++++++++++++++++++++++++++++++ packages/tuono/vite.config.ts | 2 +- 9 files changed, 132 insertions(+), 42 deletions(-) create mode 100755 packages/tuono/bin/build-prod.js create mode 100755 packages/tuono/bin/dev-ssr.js create mode 100755 packages/tuono/bin/watch.js create mode 100644 packages/tuono/src/build/index.ts diff --git a/crates/bundler/src/bundler.rs b/crates/bundler/src/bundler.rs index b1ceebaa..ee317fe9 100644 --- a/crates/bundler/src/bundler.rs +++ b/crates/bundler/src/bundler.rs @@ -7,10 +7,33 @@ use watchexec::Watchexec; use watchexec_signals::Signal; use watchexec_supervisor::job::start_job; +// What is the development pipeline? +// +// 1. Any file gets updates (rs/js/ts) +// 2. Client side vite works separately +// 3. Stop the dev server +// 4. Build the ssr client bundle +// 5. Restart the server +// +// +// The current solution is not optimized +// - We should avoid to bundle static lib (i.e. react) in the main bundle + #[tokio::main] pub async fn watch() -> Result<()> { bundle_axum_source(); + let (watch_client, _) = start_job(Arc::new(Command { + program: Program::Exec { + prog: "node_modules/.bin/tuono-dev-watch".into(), + args: vec![], + } + .into(), + options: Default::default(), + })); + + watch_client.start().await; + let (run_server, _) = start_job(Arc::new(Command { program: Program::Exec { prog: "cargo".into(), @@ -20,35 +43,27 @@ pub async fn watch() -> Result<()> { options: Default::default(), })); - let (build_server_js, _) = start_job(Arc::new(Command { + let (build_ssr_bundle, _) = start_job(Arc::new(Command { program: Program::Exec { - prog: "node_modules/.bin/vite".into(), - // TODO: update output directory: Use .tuono - args: vec![ - "build".to_string(), - "--ssr".to_string(), - "--logLevel".to_string(), - "silent".to_string(), - ], + prog: "node_modules/.bin/tuono-dev-ssr".into(), + args: vec![], } .into(), options: Default::default(), })); - build_server_js.start().await; + build_ssr_bundle.start().await; run_server.start().await; let wx = Watchexec::new(move |mut action| { for event in action.events.iter() { - for path in event.paths() { - if path.0.to_string_lossy().ends_with(".rs") { - run_server.stop(); - println!("Reloading server..."); - build_server_js.stop(); - build_server_js.start(); - bundle_axum_source(); - run_server.start(); - } + for _ in event.paths() { + run_server.stop(); + println!("Reloading server..."); + build_ssr_bundle.stop(); + build_ssr_bundle.start(); + bundle_axum_source(); + run_server.start(); } } diff --git a/crates/cli/src/actions/dev.rs b/crates/cli/src/actions/dev.rs index 32bc2349..6c9dfc7a 100644 --- a/crates/cli/src/actions/dev.rs +++ b/crates/cli/src/actions/dev.rs @@ -1,22 +1,4 @@ use bundler::bundler; -use std::path::Path; -use std::process::Command; -use std::thread; - pub fn run() { - let current_dir = std::env::current_dir().unwrap(); - - let vite_path = Path::new("node_modules/.bin/vite"); - let vite = current_dir.join(vite_path); - - let client_handler = thread::spawn(move || { - let _ = Command::new(vite).arg("dev").output(); - }); - - let server_handler = thread::spawn(move || { - bundler::watch().unwrap(); - }); - - let _ = client_handler.join(); - let _ = server_handler.join(); + bundler::watch().unwrap(); } diff --git a/crates/tuono_lib/src/ssr.rs b/crates/tuono_lib/src/ssr.rs index 5f83daa0..316a9a36 100644 --- a/crates/tuono_lib/src/ssr.rs +++ b/crates/tuono_lib/src/ssr.rs @@ -7,7 +7,7 @@ impl Js { thread_local! { pub static SSR: RefCell> = RefCell::new( Ssr::from( - read_to_string("./out/server/server-main.js").unwrap(), + read_to_string("./.tuono/server/dev-server.js").unwrap(), "" ).unwrap() ) diff --git a/packages/tuono/bin/build-prod.js b/packages/tuono/bin/build-prod.js new file mode 100755 index 00000000..950d9496 --- /dev/null +++ b/packages/tuono/bin/build-prod.js @@ -0,0 +1,5 @@ +#!/usr/bin/env node + +import { buildProd } from '../dist/esm/build/index.js' + +buildProd() diff --git a/packages/tuono/bin/dev-ssr.js b/packages/tuono/bin/dev-ssr.js new file mode 100755 index 00000000..42920df3 --- /dev/null +++ b/packages/tuono/bin/dev-ssr.js @@ -0,0 +1,5 @@ +#!/usr/bin/env node + +import { developmentSSRBundle } from '../dist/esm/build/index.js' + +developmentSSRBundle() diff --git a/packages/tuono/bin/watch.js b/packages/tuono/bin/watch.js new file mode 100755 index 00000000..4a57ec31 --- /dev/null +++ b/packages/tuono/bin/watch.js @@ -0,0 +1,5 @@ +#!/usr/bin/env node + +import { developmentCSRWatch } from '../dist/esm/build/index.js' + +developmentCSRWatch() diff --git a/packages/tuono/package.json b/packages/tuono/package.json index 8febc1d0..cf287c3b 100644 --- a/packages/tuono/package.json +++ b/packages/tuono/package.json @@ -15,6 +15,16 @@ "main": "dist/cjs/index.cjs", "module": "dist/esm/index.js", "exports": { + "./build": { + "import": { + "types": "./dist/esm/build/index.d.ts", + "default": "./dist/esm/build/index.js" + }, + "require": { + "types": "./dist/cjs/build/index.d.ts", + "default": "./dist/cjs/build/index.js" + } + }, ".": { "import": { "types": "./dist/esm/index.d.ts", @@ -27,13 +37,21 @@ }, "./package.json": "./package.json" }, + "bin": { + "tuono-dev-ssr": "./bin/dev-ssr.js", + "tuono-dev-watch": "./bin/watch.js" + }, "files": [ "dist", "src", - "README.md" + "README.md", + "bin/**" ], "dependencies": { - "tuono-router": "workspace:*" + "@vitejs/plugin-react-swc": "^3.7.0", + "tuono-router": "workspace:*", + "tuono-vite": "workspace:*", + "vite": "^5.2.11" }, "sideEffects": false, "keywords": [], diff --git a/packages/tuono/src/build/index.ts b/packages/tuono/src/build/index.ts new file mode 100644 index 00000000..afb109b4 --- /dev/null +++ b/packages/tuono/src/build/index.ts @@ -0,0 +1,60 @@ +import { build, createServer } from 'vite' +import react from '@vitejs/plugin-react-swc' +import { ViteFsRouter } from 'tuono-vite' + +const BASE_CONFIG = { + silent: true, + root: '.tuono', + publicDir: '../public', + cacheDir: 'cache', + envDir: '../', + plugins: [react(), ViteFsRouter()], +} + +export function developmentSSRBundle() { + ;(async () => { + console.log('Build SSR') + await build({ + ...BASE_CONFIG, + build: { + ssr: true, + minify: false, + outDir: 'server', + emptyOutDir: true, + rollupOptions: { + input: './.tuono/server-main.tsx', + output: { + entryFileNames: 'dev-server.js', + format: 'iife', + }, + }, + }, + ssr: { + target: 'webworker', + noExternal: true, + }, + }) + })() +} + +export function developmentCSRWatch() { + ;(async () => { + console.log('Watch files') + const server = await createServer({ + ...BASE_CONFIG, + server: { + port: 3001, + strictPort: true, + }, + build: { + manifest: true, + outDir: '../out', + emptyOutDir: true, + rollupOptions: { + input: './.tuono/client-main.tsx', + }, + }, + }) + await server.listen() + })() +} diff --git a/packages/tuono/vite.config.ts b/packages/tuono/vite.config.ts index d17a8b18..38098483 100644 --- a/packages/tuono/vite.config.ts +++ b/packages/tuono/vite.config.ts @@ -14,7 +14,7 @@ const config = defineConfig({ export default mergeConfig( config, tanstackBuildConfig({ - entry: './src/index.ts', + entry: ['./src/index.ts', './src/build/index.ts'], srcDir: './src', }), )