webpack - webpack import("path") 和 import "path" 的区别
问题描述
和有什么区别
import( "file.js" );
和
import "file.js";
两种语法都有效,但第二种情况有时在 ib 浏览器中无法正常工作。
解决方案
这都是关于“捆绑”和“块”的。
如果您将模块视为单独的乐高积木,那么捆绑包就是乐高套装。这是构建最终模型所需的所有部件。
然而,暂时继续用乐高进行类比,它有助于在一些更大、更复杂的构建中将套装分解成更小的部分,这些部分可以单独组装,然后在最后组合起来。事实上,对于一些乐高套装,套装的某些部分甚至可能是可选的。例如,我买了一套以航天飞机和运输卡车为特色的套装。它们是彼此完美互补的单独构建,并且可以在最后组合以完成模型,但如果您真正想要的只是穿梭车,那么甚至不需要建造卡车。
类似地,Webpack 允许您将“包”分解为“块”,可以根据需要动态加载或不加载。一旦呈现这些块,就会形成一个单一的、有凝聚力的捆绑包,可以无缝地工作,但是您可以选择不加载捆绑包中不需要的部分,或者延迟加载它们直到真正需要它们。
import "Foo"
在两个模块之间创建一个“硬”链接,告诉 Webpack 当前模块没有 Foo 模块就无法运行。
import("Foo")
在两个模块之间创建一个“软”链接,告诉 Webpack 当前模块可能需要另一个模块,但它可以放在一个单独的块中,以便稍后在需要时加载。例如,您可能只需要Foo
在少数不寻常的情况下,如果您需要该模块,则可以等待Foo
可用。在运行时,将在import()
调用函数时加载块。
import()
返回一个承诺,当块中的模块可用时将解决。您将需要等待承诺解决:const Foo = await import("Foo");
或import("Foo").then(function(Foo){ /* ... */ })
在任何一种情况下,模块都可以作为单个包无缝地相互交互。
因此,为了清楚起见:
模块 A:
import B from "B"
async function loadOptionalFeature() {
const C = await import(
/* webpackChunkName: "optional-chunk" */
"C"
);
// ...
}
模块 B:
import D from "D"
模块 C:
import D from "D"
import E from "E"
A
是我的入口文件。Webpack 将构建一个包含A
. 因为A
有一个硬链接B
,所以B
也会包含在核心块中。因为B
有一个硬链接D
,所以D
也会包含在核心块中。
A
有一个“软”链接C
,所以 webpack可以分成C
自己的块(可能有可用的配置选项)。C
具有指向 的“硬”链接D
,但D
已包含在核心块中,因此不包含在optional-chunk
. C
还有一个“硬”链接E
,因为E
它不包含在核心块中,所以它包含在optional-chunk
.
推荐阅读
- html - 项目符号列表与 css 属性/值列不均匀:2;
- linux - 使用密码加密和解密文件
- c++ - 如何将常量中的值设置为 struct c++
- c# - 如何反序列化复杂的嵌套 JSON?
- java - Jackson/Hibernate,元获取方法和序列化
- css - 如何添加背景图片
- mysql - 如何使用 redis 代替 MySQL 进行 Laravel Passport 令牌存储和身份验证
- apache-spark - 在 spark sql 中显示特定值
- sql - 从一组字符串列表中随机分配一个字符串
- java - Bean 名称“团队”的 BindingResult 和普通目标对象都不能用作请求属性