1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-11-21 15:04:11 -05:00

core: don't include_str extension js code (#10786)

This speeds up incremental rebuild when only touching JS files by 13-15%

Rebuild time after `touch 01_broadcast_channel.js`:

main: run 1 49.18s, run 2 50.34s
this: run 1 43.12s, run 2 43.19s
This commit is contained in:
Luca Casonato 2021-05-29 16:20:52 +02:00 committed by GitHub
parent bbefceddb9
commit 10e50a1207
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 26 additions and 13 deletions

View file

@ -1,7 +1,8 @@
use crate::error::AnyError; use crate::error::AnyError;
use crate::{OpFn, OpState}; use crate::{OpFn, OpState};
pub type SourcePair = (&'static str, &'static str); pub type SourcePair = (&'static str, Box<SourceLoadFn>);
pub type SourceLoadFn = dyn Fn() -> Result<String, AnyError>;
pub type OpPair = (&'static str, Box<OpFn>); pub type OpPair = (&'static str, Box<OpFn>);
pub type OpMiddlewareFn = dyn Fn(&'static str, Box<OpFn>) -> Box<OpFn>; pub type OpMiddlewareFn = dyn Fn(&'static str, Box<OpFn>) -> Box<OpFn>;
pub type OpStateFn = dyn Fn(&mut OpState) -> Result<(), AnyError>; pub type OpStateFn = dyn Fn(&mut OpState) -> Result<(), AnyError>;
@ -24,10 +25,10 @@ impl Extension {
/// returns JS source code to be loaded into the isolate (either at snapshotting, /// returns JS source code to be loaded into the isolate (either at snapshotting,
/// or at startup). as a vector of a tuple of the file name, and the source code. /// or at startup). as a vector of a tuple of the file name, and the source code.
pub fn init_js(&self) -> Vec<SourcePair> { pub fn init_js(&self) -> &[SourcePair] {
match &self.js_files { match &self.js_files {
Some(files) => files.clone(), Some(files) => files,
None => vec![], None => &[],
} }
} }
@ -104,8 +105,9 @@ impl ExtensionBuilder {
} }
} }
} }
/// Helps embed JS files in an extension. Returns Vec<(&'static str, &'static str)> /// Helps embed JS files in an extension. Returns Vec<(&'static str, Box<SourceLoadFn>)>
/// representing the filename and source code. /// representing the filename and source code. This is only meant for extensions
/// that will be snapshotted, as code will be loaded at runtime.
/// ///
/// Example: /// Example:
/// ```ignore /// ```ignore
@ -121,7 +123,13 @@ macro_rules! include_js_files {
vec![ vec![
$(( $((
concat!($prefix, "/", $file), concat!($prefix, "/", $file),
include_str!($file), Box::new(|| {
let c = std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR"));
let path = c.join($file);
println!("cargo:rerun-if-changed={}", path.display());
let src = std::fs::read_to_string(path)?;
Ok(src)
}),
),)+ ),)+
] ]
}; };

View file

@ -385,8 +385,9 @@ impl JsRuntime {
for m in extensions.iter_mut() { for m in extensions.iter_mut() {
let js_files = m.init_js(); let js_files = m.init_js();
for (filename, source) in js_files { for (filename, source) in js_files {
let source = source()?;
// TODO(@AaronO): use JsRuntime::execute_static() here to move src off heap // TODO(@AaronO): use JsRuntime::execute_static() here to move src off heap
self.execute(filename, source)?; self.execute(filename, &source)?;
} }
} }
// Restore extensions // Restore extensions

View file

@ -9,10 +9,12 @@ fn setup() -> Vec<Extension> {
deno_timers::init::<deno_timers::NoTimersPermission>(), deno_timers::init::<deno_timers::NoTimersPermission>(),
Extension::builder() Extension::builder()
.js(vec![ .js(vec![
("setup", r#" ("setup",
const { opNow, setTimeout, handleTimerMacrotask } = globalThis.__bootstrap.timers; Box::new(|| Ok(r#"
Deno.core.setMacrotaskCallback(handleTimerMacrotask); const { opNow, setTimeout, handleTimerMacrotask } = globalThis.__bootstrap.timers;
"#), Deno.core.setMacrotaskCallback(handleTimerMacrotask);
"#.to_owned())),
),
]) ])
.state(|state| { .state(|state| {
state.put(deno_timers::NoTimersPermission{}); state.put(deno_timers::NoTimersPermission{});

View file

@ -10,7 +10,9 @@ fn setup() -> Vec<Extension> {
Extension::builder() Extension::builder()
.js(vec![( .js(vec![(
"setup", "setup",
"const { URL } = globalThis.__bootstrap.url;", Box::new(|| {
Ok(r#"const { URL } = globalThis.__bootstrap.url;"#.to_owned())
}),
)]) )])
.build(), .build(),
] ]