diff --git a/ext/cron/lib.rs b/ext/cron/lib.rs index 7a3bb68763171b..63dfa4f52c3d42 100644 --- a/ext/cron/lib.rs +++ b/ext/cron/lib.rs @@ -32,7 +32,7 @@ deno_core::extension!(deno_cron, op_cron_create, op_cron_next, ], - esm = [ "01_cron.ts" ], + lazy_loaded_esm = [ "01_cron.ts" ], options = { cron_handler: C, }, diff --git a/ext/ffi/lib.rs b/ext/ffi/lib.rs index b1fe4399b025bd..e6aa8ad44fbcdd 100644 --- a/ext/ffi/lib.rs +++ b/ext/ffi/lib.rs @@ -80,7 +80,7 @@ deno_core::extension!(deno_ffi, op_ffi_unsafe_callback_ref, op_ffi_get_turbocall_target, ], - esm = [ "00_ffi.js" ], + lazy_loaded_esm = [ "00_ffi.js" ], options = { deno_rt_native_addon_loader: Option, }, diff --git a/ext/kv/lib.rs b/ext/kv/lib.rs index 006e4b58e41376..7bc11fb41b13a0 100644 --- a/ext/kv/lib.rs +++ b/ext/kv/lib.rs @@ -76,7 +76,7 @@ deno_core::extension!(deno_kv, op_kv_watch, op_kv_watch_next, ], - esm = [ "01_db.ts" ], + lazy_loaded_esm = [ "01_db.ts" ], options = { handler: DBH, config: KvConfig, diff --git a/ext/os/lib.rs b/ext/os/lib.rs index 623d98951c6392..6bfaff2ff3ed0a 100644 --- a/ext/os/lib.rs +++ b/ext/os/lib.rs @@ -96,7 +96,8 @@ deno_core::extension!( ops::signal::op_signal_unbind, ops::signal::op_signal_poll, ], - esm = ["30_os.js", "40_signals.js"], + esm = ["30_os.js"], + lazy_loaded_esm = ["40_signals.js"], options = { exit_code: Option, }, diff --git a/runtime/js/90_deno_ns.js b/runtime/js/90_deno_ns.js index 08b6bef25d72dd..570580fcf7c8bb 100644 --- a/runtime/js/90_deno_ns.js +++ b/runtime/js/90_deno_ns.js @@ -11,7 +11,6 @@ import { import * as timers from "ext:deno_web/02_timers.js"; import * as httpClient from "ext:deno_fetch/22_http_client.js"; import * as console from "ext:deno_web/01_console.js"; -import * as ffi from "ext:deno_ffi/00_ffi.js"; import * as net from "ext:deno_net/01_net.js"; import * as tls from "ext:deno_net/02_tls.js"; import * as serve from "ext:deno_http/00_serve.ts"; @@ -23,12 +22,8 @@ import * as permissions from "ext:runtime/10_permissions.js"; import * as io from "ext:deno_io/12_io.js"; import * as fs from "ext:deno_fs/30_fs.js"; import * as os from "ext:deno_os/30_os.js"; -import * as fsEvents from "ext:runtime/40_fs_events.js"; import * as process from "ext:deno_process/40_process.js"; -import * as signals from "ext:deno_os/40_signals.js"; import * as tty from "ext:runtime/40_tty.js"; -import * as kv from "ext:deno_kv/01_db.ts"; -import * as cron from "ext:deno_cron/01_cron.ts"; import * as webgpuSurface from "ext:deno_webgpu/02_surface.js"; import * as telemetry from "ext:deno_telemetry/telemetry.ts"; import { unstableIds } from "ext:deno_features/flags.js"; @@ -37,6 +32,11 @@ import { bundle } from "ext:deno_bundle_runtime/bundle.ts"; const { ObjectDefineProperties, Float64Array } = primordials; +const loadFfi = core.createLazyLoader("ext:deno_ffi/00_ffi.js"); +const loadFsEvents = core.createLazyLoader("ext:runtime/40_fs_events.js"); +const loadSignals = core.createLazyLoader("ext:deno_os/40_signals.js"); +const loadKv = core.createLazyLoader("ext:deno_kv/01_db.ts"); +const loadCron = core.createLazyLoader("ext:deno_cron/01_cron.ts"); const loadQuic = core.createLazyLoader("ext:deno_net/03_quic.js"); const loadWebTransport = core.createLazyLoader("ext:deno_web/webtransport.js"); @@ -55,7 +55,7 @@ const denoNs = { readTextFileSync: fs.readTextFileSync, readFile: fs.readFile, readFileSync: fs.readFileSync, - watchFs: fsEvents.watchFs, + // watchFs is lazy-loaded below via ObjectDefineProperties chmodSync: fs.chmodSync, chmod: fs.chmod, chown: fs.chown, @@ -145,8 +145,7 @@ const denoNs = { utime: fs.utime, utimeSync: fs.utimeSync, kill: process.kill, - addSignalListener: signals.addSignalListener, - removeSignalListener: signals.removeSignalListener, + // signals are lazy-loaded below via ObjectDefineProperties refTimer: timers.refTimer, unrefTimer: timers.unrefTimer, osRelease: os.osRelease, @@ -162,17 +161,46 @@ const denoNs = { spawn: process.spawn, spawnAndWait: process.spawnAndWait, spawnAndWaitSync: process.spawnAndWaitSync, - dlopen: ffi.dlopen, - UnsafeCallback: ffi.UnsafeCallback, - UnsafePointer: ffi.UnsafePointer, - UnsafePointerView: ffi.UnsafePointerView, - UnsafeFnPointer: ffi.UnsafeFnPointer, + // FFI is lazy-loaded below via ObjectDefineProperties umask: fs.umask, HttpClient: httpClient.HttpClient, createHttpClient: httpClient.createHttpClient, telemetry: telemetry.telemetry, }; +// Lazy-loaded properties on denoNs. +ObjectDefineProperties(denoNs, { + watchFs: core.propWritableLazyLoaded( + (fsEvents) => fsEvents.watchFs, + loadFsEvents, + ), + dlopen: core.propWritableLazyLoaded((ffi) => ffi.dlopen, loadFfi), + UnsafeCallback: core.propWritableLazyLoaded( + (ffi) => ffi.UnsafeCallback, + loadFfi, + ), + UnsafePointer: core.propWritableLazyLoaded( + (ffi) => ffi.UnsafePointer, + loadFfi, + ), + UnsafePointerView: core.propWritableLazyLoaded( + (ffi) => ffi.UnsafePointerView, + loadFfi, + ), + UnsafeFnPointer: core.propWritableLazyLoaded( + (ffi) => ffi.UnsafeFnPointer, + loadFfi, + ), + addSignalListener: core.propWritableLazyLoaded( + (signals) => signals.addSignalListener, + loadSignals, + ), + removeSignalListener: core.propWritableLazyLoaded( + (signals) => signals.removeSignalListener, + loadSignals, + ), +}); + const denoNsUnstableById = { __proto__: null }; denoNsUnstableById[unstableIds.bundle] = { @@ -181,17 +209,25 @@ denoNsUnstableById[unstableIds.bundle] = { // denoNsUnstableById[unstableIds.broadcastChannel] = { __proto__: null } -denoNsUnstableById[unstableIds.cron] = { - cron: cron.cron, -}; +denoNsUnstableById[unstableIds.cron] = {}; +ObjectDefineProperties(denoNsUnstableById[unstableIds.cron], { + cron: core.propWritableLazyLoaded((cron) => cron.cron, loadCron), +}); -denoNsUnstableById[unstableIds.kv] = { - openKv: kv.openKv, - AtomicOperation: kv.AtomicOperation, - Kv: kv.Kv, - KvU64: kv.KvU64, - KvListIterator: kv.KvListIterator, -}; +denoNsUnstableById[unstableIds.kv] = {}; +ObjectDefineProperties(denoNsUnstableById[unstableIds.kv], { + openKv: core.propWritableLazyLoaded((kv) => kv.openKv, loadKv), + AtomicOperation: core.propWritableLazyLoaded( + (kv) => kv.AtomicOperation, + loadKv, + ), + Kv: core.propWritableLazyLoaded((kv) => kv.Kv, loadKv), + KvU64: core.propWritableLazyLoaded((kv) => kv.KvU64, loadKv), + KvListIterator: core.propWritableLazyLoaded( + (kv) => kv.KvListIterator, + loadKv, + ), +}); denoNsUnstableById[unstableIds.net] = { listenDatagram: net.createListenDatagram( diff --git a/runtime/shared.rs b/runtime/shared.rs index 2ab872519b8dab..a300e9ee04da97 100644 --- a/runtime/shared.rs +++ b/runtime/shared.rs @@ -31,7 +31,6 @@ extension!(runtime, "06_util.js", "10_permissions.js", "11_workers.js", - "40_fs_events.js", "40_tty.js", "41_prompt.js", "90_deno_ns.js", @@ -39,6 +38,10 @@ extension!(runtime, "98_global_scope_window.js", "98_global_scope_worker.js" ], + lazy_loaded_esm = [ + dir "js", + "40_fs_events.js", + ], customizer = |ext: &mut Extension| { #[cfg(not(feature = "exclude_runtime_main_js"))] {