Skip to content

Commit

Permalink
feat(es/modules): Optimize a dynamic import with a literal path (#5049)
Browse files Browse the repository at this point in the history
  • Loading branch information
magic-akari committed Jun 28, 2022
1 parent 48c562a commit 2cc229e
Show file tree
Hide file tree
Showing 7 changed files with 40 additions and 24 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@ Object.defineProperty(exports, "__esModule", {
});
const _interopRequireWildcard = require("../../../../../../../../../packages/swc-helpers/src/_interop_require_wildcard.mjs").default;
(async function() {
const { displayA } = await Promise.resolve("../packages/a/src/index").then((p)=>_interopRequireWildcard(require(p)));
const { displayA } = await Promise.resolve().then(()=>_interopRequireWildcard(require("../packages/a/src/index")));
console.log(displayA());
})();
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@ Object.defineProperty(exports, "__esModule", {
});
const _interopRequireWildcard = require("@swc/helpers/lib/_interop_require_wildcard.js").default;
(async ()=>{
const example = await Promise.resolve("./example").then((p)=>_interopRequireWildcard(require(p)));
const example = await Promise.resolve().then(()=>_interopRequireWildcard(require("./example")));
console.log(example.foo);
})();
26 changes: 21 additions & 5 deletions crates/swc_ecma_transforms_module/src/common_js.rs
Original file line number Diff line number Diff line change
Expand Up @@ -152,9 +152,13 @@ impl VisitMut for Cjs {
}) if !self.config.ignore_dynamic => {
args.visit_mut_with(self);

let mut is_lit_path = false;

args.get_mut(0).into_iter().for_each(|x| {
if let ExprOrSpread { spread: None, expr } = x {
if let Expr::Lit(Lit::Str(Str { value, raw, .. })) = &mut **expr {
is_lit_path = true;

*value = self.resolver.resolve(value.clone());
*raw = None;
}
Expand All @@ -168,6 +172,7 @@ impl VisitMut for Cjs {
quote_ident!(require_span, "require"),
!self.config.no_interop,
self.support_arrow,
is_lit_path,
);
}
Expr::Member(MemberExpr {
Expand Down Expand Up @@ -354,23 +359,34 @@ impl Cjs {
}
}

/// ```javascript
/// Promise.resolve(args).then(p => require(p))
/// // for literial dynamic import:
/// Promise.resolve().then(() => require(args))
/// ```
pub(crate) fn cjs_dynamic_import(
span: Span,
args: Vec<ExprOrSpread>,
require: Ident,
es_module_interop: bool,
support_arrow: bool,
is_lit_path: bool,
) -> Expr {
let p = private_ident!("p");

let (resolve_args, callback_params, require_args) = if is_lit_path {
(vec![], vec![], args)
} else {
(args, vec![p.clone().into()], vec![p.as_arg()])
};

let then = member_expr!(DUMMY_SP, Promise.resolve)
// TODO: handle import assert
.as_call(DUMMY_SP, args)
.as_call(DUMMY_SP, resolve_args)
.make_member(quote_ident!("then"));

let path = private_ident!("p");

let import_expr = {
let require = require.as_call(DUMMY_SP, vec![path.clone().as_arg()]);
let require = require.as_call(DUMMY_SP, require_args);

if es_module_interop {
helper_expr!(interop_require_wildcard, "interopRequireWildcard")
Expand All @@ -383,7 +399,7 @@ pub(crate) fn cjs_dynamic_import(
then.as_call(
span,
vec![import_expr
.into_lazy_auto(vec![path.into()], support_arrow)
.into_lazy_auto(callback_params, support_arrow)
.as_arg()],
)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
"use strict";
async function foo() {
await Promise.resolve("foo").then((p)=>_interopRequireWildcard(require(p)));
await Promise.resolve().then(()=>_interopRequireWildcard(require("foo")));
}
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
"use strict";
const { default: ora } = await Promise.resolve("ora").then((p)=>_interopRequireWildcard(require(p)));
const { default: ora } = await Promise.resolve().then(()=>_interopRequireWildcard(require("ora")));
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
"use strict";
(async ()=>{
const example = await Promise.resolve("./example").then((p)=>_interopRequireWildcard(require(p)));
const example = await Promise.resolve().then(()=>_interopRequireWildcard(require("./example")));
console.log(example.foo);
})();
28 changes: 14 additions & 14 deletions node-swc/__tests__/transform/issue_4730_test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -32,18 +32,18 @@ it("should work", async () => {
},
});
expect(code).toMatchInlineSnapshot(`
"\\"use strict\\";
Object.defineProperty(exports, \\"__esModule\\", {
value: true
});
const _interopRequireWildcard = require(\\"@swc/helpers/lib/_interop_require_wildcard.js\\").default;
const _b = require(\\"../packages/b/src/index\\");
async function display() {
const displayA = await Promise.resolve(\\"../packages/a/src/index\\").then((p)=>_interopRequireWildcard(require(p))).then((c)=>c.displayA);
console.log(displayA());
console.log((0, _b.displayB)());
}
display();
"
`);
"\\"use strict\\";
Object.defineProperty(exports, \\"__esModule\\", {
value: true
});
const _interopRequireWildcard = require(\\"@swc/helpers/lib/_interop_require_wildcard.js\\").default;
const _b = require(\\"../packages/b/src/index\\");
async function display() {
const displayA = await Promise.resolve().then(()=>_interopRequireWildcard(require(\\"../packages/a/src/index\\"))).then((c)=>c.displayA);
console.log(displayA());
console.log((0, _b.displayB)());
}
display();
"
`);
});

1 comment on commit 2cc229e

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Benchmark

Benchmark suite Current: 2cc229e Previous: 7d4e6be Ratio
es/full/minify/libraries/antd 1652252108 ns/iter (± 57653031) 1768503220 ns/iter (± 45264695) 0.93
es/full/minify/libraries/d3 412703254 ns/iter (± 23407654) 440754679 ns/iter (± 11774964) 0.94
es/full/minify/libraries/echarts 1631744625 ns/iter (± 35487374) 1723654422 ns/iter (± 46910408) 0.95
es/full/minify/libraries/jquery 97847070 ns/iter (± 7492554) 96344107 ns/iter (± 6168313) 1.02
es/full/minify/libraries/lodash 123068302 ns/iter (± 6507436) 127560655 ns/iter (± 3612056) 0.96
es/full/minify/libraries/moment 56658187 ns/iter (± 3900277) 56223510 ns/iter (± 1713824) 1.01
es/full/minify/libraries/react 18185462 ns/iter (± 302239) 19298885 ns/iter (± 549665) 0.94
es/full/minify/libraries/terser 628247895 ns/iter (± 8911334) 641148488 ns/iter (± 24182313) 0.98
es/full/minify/libraries/three 564978863 ns/iter (± 15134602) 588860031 ns/iter (± 17919401) 0.96
es/full/minify/libraries/typescript 3393544763 ns/iter (± 50370372) 3696982153 ns/iter (± 74914336) 0.92
es/full/minify/libraries/victory 705208985 ns/iter (± 9701178) 794959798 ns/iter (± 20411868) 0.89
es/full/minify/libraries/vue 128389896 ns/iter (± 4507634) 147111296 ns/iter (± 2697669) 0.87
es/full/codegen/es3 31873 ns/iter (± 976) 32511 ns/iter (± 1342) 0.98
es/full/codegen/es5 31840 ns/iter (± 927) 32937 ns/iter (± 3698) 0.97
es/full/codegen/es2015 31794 ns/iter (± 2448) 32931 ns/iter (± 1919) 0.97
es/full/codegen/es2016 32583 ns/iter (± 368) 33727 ns/iter (± 3518) 0.97
es/full/codegen/es2017 32417 ns/iter (± 573) 33791 ns/iter (± 5653) 0.96
es/full/codegen/es2018 31422 ns/iter (± 1029) 32937 ns/iter (± 1260) 0.95
es/full/codegen/es2019 31741 ns/iter (± 1402) 31921 ns/iter (± 1693) 0.99
es/full/codegen/es2020 31373 ns/iter (± 1113) 33480 ns/iter (± 5750) 0.94
es/full/all/es3 181481338 ns/iter (± 6201831) 195465130 ns/iter (± 9145060) 0.93
es/full/all/es5 170745988 ns/iter (± 4632753) 197848024 ns/iter (± 16625473) 0.86
es/full/all/es2015 139280555 ns/iter (± 10191271) 157281428 ns/iter (± 12746581) 0.89
es/full/all/es2016 137891669 ns/iter (± 4471545) 141646103 ns/iter (± 7558668) 0.97
es/full/all/es2017 137105788 ns/iter (± 5195260) 140424429 ns/iter (± 5382066) 0.98
es/full/all/es2018 136495277 ns/iter (± 4634623) 138375042 ns/iter (± 4065629) 0.99
es/full/all/es2019 135530630 ns/iter (± 4879329) 137951083 ns/iter (± 4145257) 0.98
es/full/all/es2020 134624354 ns/iter (± 5575736) 141799983 ns/iter (± 8338628) 0.95
es/full/parser 709810 ns/iter (± 21013) 739714 ns/iter (± 38094) 0.96
es/full/base/fixer 29141 ns/iter (± 977) 29709 ns/iter (± 1580) 0.98
es/full/base/resolver_and_hygiene 86752 ns/iter (± 3025) 90176 ns/iter (± 3474) 0.96
serialization of ast node 206 ns/iter (± 4) 218 ns/iter (± 12) 0.94
serialization of serde 210 ns/iter (± 4) 232 ns/iter (± 16) 0.91

This comment was automatically generated by workflow using github-action-benchmark.

Please sign in to comment.