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::{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 OpMiddlewareFn = dyn Fn(&'static str, Box<OpFn>) -> Box<OpFn>;
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,
/// 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 {
Some(files) => files.clone(),
None => vec![],
Some(files) => files,
None => &[],
}
}
@ -104,8 +105,9 @@ impl ExtensionBuilder {
}
}
}
/// Helps embed JS files in an extension. Returns Vec<(&'static str, &'static str)>
/// representing the filename and source code.
/// Helps embed JS files in an extension. Returns Vec<(&'static str, Box<SourceLoadFn>)>
/// representing the filename and source code. This is only meant for extensions
/// that will be snapshotted, as code will be loaded at runtime.
///
/// Example:
/// ```ignore
@ -121,7 +123,13 @@ macro_rules! include_js_files {
vec![
$((
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() {
let js_files = m.init_js();
for (filename, source) in js_files {
let source = source()?;
// TODO(@AaronO): use JsRuntime::execute_static() here to move src off heap
self.execute(filename, source)?;
self.execute(filename, &source)?;
}
}
// Restore extensions

View file

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

View file

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