From fc9988e727a448cb4f977349b23bd430262fa3ce Mon Sep 17 00:00:00 2001 From: rxliuli Date: Wed, 11 Feb 2026 15:48:12 +0800 Subject: [PATCH] feat: add browser-only WASM build to eliminate Node.js require() warnings in bundlers When bundling sql.js for browser environments, tools like Vite, Webpack, and esbuild emit warnings about `require("node:fs")` and `require("node:crypto")` being externalized for browser compatibility. This adds a new `sql-wasm-browser.js` build variant compiled with `-s ENVIRONMENT=web,worker`, which completely eliminates Node.js code paths from the generated JavaScript. The browser variant is exposed via the `exports` field in package.json using the `browser` condition, so bundlers automatically select the clean version. The original `sql-wasm.js` with full Node.js support is preserved as the `default` export, ensuring no breaking changes for existing users. Closes #620 Co-Authored-By: Claude Opus 4.6 --- Makefile | 21 +++++++++++++++++++-- package.json | 7 +++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 45306539..9b29aa5b 100644 --- a/Makefile +++ b/Makefile @@ -50,6 +50,11 @@ EMFLAGS_WASM = \ -s WASM=1 \ -s ALLOW_MEMORY_GROWTH=1 +EMFLAGS_WASM_BROWSER = \ + -s WASM=1 \ + -s ALLOW_MEMORY_GROWTH=1 \ + -s ENVIRONMENT=web,worker + EMFLAGS_OPTIMIZED= \ -Oz \ -flto \ @@ -73,7 +78,7 @@ EXPORTED_METHODS_JSON_FILES = src/exported_functions.json src/exported_runtime_m all: optimized debug worker .PHONY: debug -debug: dist/sql-asm-debug.js dist/sql-wasm-debug.js +debug: dist/sql-asm-debug.js dist/sql-wasm-debug.js dist/sql-wasm-browser-debug.js dist/sql-asm-debug.js: $(BITCODE_FILES) $(OUTPUT_WRAPPER_FILES) $(SOURCE_API_FILES) $(EXPORTED_METHODS_JSON_FILES) $(EMCC) $(EMFLAGS) $(EMFLAGS_DEBUG) $(EMFLAGS_ASM) $(BITCODE_FILES) $(EMFLAGS_PRE_JS_FILES) -o $@ @@ -87,8 +92,14 @@ dist/sql-wasm-debug.js: $(BITCODE_FILES) $(OUTPUT_WRAPPER_FILES) $(SOURCE_API_FI cat src/shell-pre.js out/tmp-raw.js src/shell-post.js > $@ rm out/tmp-raw.js +dist/sql-wasm-browser-debug.js: $(BITCODE_FILES) $(OUTPUT_WRAPPER_FILES) $(SOURCE_API_FILES) $(EXPORTED_METHODS_JSON_FILES) + $(EMCC) $(EMFLAGS) $(EMFLAGS_DEBUG) $(EMFLAGS_WASM_BROWSER) $(BITCODE_FILES) $(EMFLAGS_PRE_JS_FILES) -o $@ + mv $@ out/tmp-raw.js + cat src/shell-pre.js out/tmp-raw.js src/shell-post.js > $@ + rm out/tmp-raw.js + .PHONY: optimized -optimized: dist/sql-asm.js dist/sql-wasm.js dist/sql-asm-memory-growth.js +optimized: dist/sql-asm.js dist/sql-wasm.js dist/sql-wasm-browser.js dist/sql-asm-memory-growth.js dist/sql-asm.js: $(BITCODE_FILES) $(OUTPUT_WRAPPER_FILES) $(SOURCE_API_FILES) $(EXPORTED_METHODS_JSON_FILES) $(EMCC) $(EMFLAGS) $(EMFLAGS_OPTIMIZED) $(EMFLAGS_ASM) $(BITCODE_FILES) $(EMFLAGS_PRE_JS_FILES) -o $@ @@ -102,6 +113,12 @@ dist/sql-wasm.js: $(BITCODE_FILES) $(OUTPUT_WRAPPER_FILES) $(SOURCE_API_FILES) $ cat src/shell-pre.js out/tmp-raw.js src/shell-post.js > $@ rm out/tmp-raw.js +dist/sql-wasm-browser.js: $(BITCODE_FILES) $(OUTPUT_WRAPPER_FILES) $(SOURCE_API_FILES) $(EXPORTED_METHODS_JSON_FILES) + $(EMCC) $(EMFLAGS) $(EMFLAGS_OPTIMIZED) $(EMFLAGS_WASM_BROWSER) $(BITCODE_FILES) $(EMFLAGS_PRE_JS_FILES) -o $@ + mv $@ out/tmp-raw.js + cat src/shell-pre.js out/tmp-raw.js src/shell-post.js > $@ + rm out/tmp-raw.js + dist/sql-asm-memory-growth.js: $(BITCODE_FILES) $(OUTPUT_WRAPPER_FILES) $(SOURCE_API_FILES) $(EXPORTED_METHODS_JSON_FILES) $(EMCC) $(EMFLAGS) $(EMFLAGS_OPTIMIZED) $(EMFLAGS_ASM_MEMORY_GROWTH) $(BITCODE_FILES) $(EMFLAGS_PRE_JS_FILES) -o $@ mv $@ out/tmp-raw.js diff --git a/package.json b/package.json index 404fe3a9..22e25a58 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,13 @@ ], "license": "MIT", "main": "./dist/sql-wasm.js", + "exports": { + ".": { + "browser": "./dist/sql-wasm-browser.js", + "default": "./dist/sql-wasm.js" + }, + "./dist/*": "./dist/*" + }, "scripts": { "build": "make", "rebuild": "npm run clean && npm run build",