跳到内容

WICG/导入地图

导入地图

或者,如何控制JavaScript导入的行为

目录

基本思想

此建议允许控制JavaScript获取的URL进口声明和导入()表达。这允许“裸导入说明符”,例如从“时刻”导入时刻,以工作。

这样做的机制是通过导入地图它通常可用于控制模块说明符的解析。作为一个介绍性示例,请考虑以下代码

进口 瞬间  “瞬间”;
进口 { 隔板 }  “lodash”;

今天,这抛出了这样的赤裸裸的说明符显式保留。通过向浏览器提供以下导入映射

<脚本 类型="导入映射">
{
  “导入”:{
    “瞬间”:“/node_modules/moment/src/momer.js”,
    “lodash”:“/node_modules/lodash-es/lodash.js”
  }
}
</脚本>

上面的内容就像你写的一样

进口 瞬间  “/node_modules/moment/src/momer.js”;
进口 { 隔板 }  “/node_modules/lodash-es/lodash.js”;

有关新产品的更多信息“导入地图”的值<脚本>type=“”属性,请参见安装段目前,我们将集中讨论映射的语义,推迟安装讨论。

背景

具有ES2015之前模块系统经验的Web开发人员,例如CommonJS(在Node中或使用浏览器的webpack/browserify捆绑),习惯于使用简单语法导入模块:

常数 $ = 要求(“jquery”);
常数 {摘下} = 要求(“lodash”);

翻译成JavaScript内置模块系统的语言后,这些将是

进口 $  “jquery”;
进口 { 摘下 }  “lodash”;

在这样的系统中“jquery”“lodash”映射到完整文件名或URL。更详细地说,这些说明符表示包装,通常在净现值法; 通过只指定包的名称,它们隐式地请求该包的主模块。

该系统的主要优点是,它可以方便地跨生态系统进行协调。任何人都可以使用包的知名名称编写模块并包含导入语句,并让Node.js运行时或其构建时工具负责将其转换为磁盘上的实际文件(包括确定版本控制注意事项)。

如今,许多web开发人员甚至使用JavaScript的本机模块语法,但将其与裸导入说明符相结合,从而使他们的代码在没有逐应用程序预先修改的情况下无法在web上运行。我们希望解决这个问题,并为网络带来这些好处。

导入映射

我们通过一系列示例解释导入地图的功能。

说明符重映射示例

JavaScript模块的裸说明符

正如引言中提到的,

{“导入”: {“瞬间”:"/节点模块/moment/src/moment.js",“lodash”:"/node_modules/lodash-es/lodash.js节点模块"}}

在JavaScript代码中提供了裸导入说明符支持:

进口 瞬间  “瞬间”;
进口(“lodash”).然后(_ =>...);

请注意,映射的右侧(称为“地址”)必须以开头/,../,或./,或可解析为绝对URL,以标识URL。在相对URL类地址的情况下,它们是相对于导入映射的基本URL进行解析的,即内联导入映射的页面的基本URL,以及外部导入映射的导入映射资源的URL。

尤其是“裸”相对URL,如节点模块/moment/src/moment.js暂时不会在这些职位上工作。这是一种保守的违约,因为在未来我们可能希望允许多个导入映射,这可能会改变右手边的含义,尤其会影响这些裸露的案例。

通过尾部斜杠的“包裹”

在JavaScript生态系统中,有一个包是很常见的(净现值法)包含多个模块或其他文件。对于这种情况,我们希望将模块说明符空间中的前缀映射到fetchable-URL空间中的另一个前缀。

导入映射通过为以斜杠结尾的说明符键赋予特殊含义来实现这一点。因此,类似于

{“导入”: {“瞬间”:"/节点模块/moment/src/moment.js",“瞬间/”:"/节点模块/力矩/src/",“lodash”:"/节点模块/lodash-es/lodash.js",“lodash/”:"/节点模块/lodash-es/"}}

不仅允许导入以下主要模块

进口 瞬间  “瞬间”;
进口 _  “lodash”;

但也包括非主要模块,例如。

进口 本地数据  “moment/locale/zh-cn.js”;
进口 英尺/平方英尺  “lodash/fp.js”;

无扩展进口

在Node.js生态系统中,导入文件而不包含扩展名也是很常见的。我们没有奢侈品尝试多个文件扩展名,直到找到匹配的文件。然而,我们可以通过使用导入映射来模拟类似的东西。例如,

{“导入”: {“lodash”:"/节点模块/lodash-es/lodash.js",“lodash/”:"/节点模块/lodash es/",“lodash/fp”:"/节点模块/lodash-es/fp.js",}}

不仅允许从“lodash/fp.js”导入fp,但也允许从“lodash/fp”导入fp.

尽管这个例子说明了它是如何可能的要允许使用导入映射进行无扩展导入,不一定可取的。这样做会使导入映射膨胀,并使包的界面变得不那么简单,既适用于人类,也适用于工具。

如果您需要在包中允许无扩展导入,那么这种膨胀尤其有问题。在这种情况下,您将需要包中每个文件的导入映射条目,而不仅仅是顶级入口点。例如,允许导入“./fp”从内部/节点模块/lodash-es/lodash.js文件,则需要导入条目映射/节点模块/lodash-es/fp/节点模块/lodash-es/fp.js现在想象一下,对引用的每个没有扩展名的文件重复此操作。

因此,我们建议在导入映射或编写模块中使用此类模式时要小心。如果我们不依赖导入映射来修补与文件扩展相关的不匹配,那么对生态系统来说会更简单。

通用类URL说明符重新映射

作为允许一般重新映射说明符的一部分,导入映射特别允许重新映射类似URL的说明符,例如"https://example.com/foo.mjs"“./bar.mjs”。它的实际用途是映射散列,但这里我们演示了一些基本的概念:

{“导入”: {"https://www.unpkg.com/vue/dist/vue.runtime.esm.js":"/节点模块/vue/dist/vue.runtime.esm.js"}}

此重新映射可确保任何导入unpkg.com版本的Vue(至少在该URL上)都会从本地服务器获取该版本。

{“导入”: {“/app/helpers.mjs”:"/app/helpers/index.mjs"}}

此重新映射可确保任何类似URL的导入解析为/app/helpers.mjs应用程序/帮助程序,包括例如导入“./helpers.mjs”从内部文件/应用程序/,或导入“../helpers.mjs”来自内部文件/应用程序/模型,将改为解析为/app/helpers/index.mjs这可能不是一个好主意;与其创建使代码模糊的间接寻址,不如只更新源文件以导入正确的文件。但是,这是一个演示导入地图功能的有用示例。

这种重新映射也可以在前缀匹配的基础上进行,方法是以尾部斜杠结束说明符键:

{“导入”: {"https://www.unpkg.com/vue/":"/节点模块/vue/"}}

此版本确保以子字符串开头的说明符的导入语句"https://www.unpkg.com/vue/"将映射到下面相应的URL/节点模块/vue/.

总的来说,问题是重新映射对于类URL的导入与裸导入的工作原理相同。我们前面的示例改变了诸如“lodash”,从而改变了导入“lodash”。在这里,我们更改了说明符的分辨率,如“/app/helpers.mjs”从而改变了导入“/app/helpers.mjs”.

请注意,只有当类URL说明符具有特殊方案:例如,映射“data:text/”:“/foo”不会影响导入“data:text/javascript,console.log('test')”,但只会影响导入“数据:text/”.

在脚本文件名中映射散列

脚本文件的文件名中通常有一个唯一的散列,以提高可缓存性。请参阅这项技术的一般性讨论,或这是一个更加以JavaScript和webpack为中心的讨论.

对于模块图,此技术可能存在问题:

  • 考虑一个简单的模块图应用程序.mjs取决于dep.mjs程序这取决于子部门.mjs通常,如果您升级或更改子部门.mjs,app.mjs应用程序dep.mjs公司可以保持缓存,只需要传输新的子部门.mjs通过网络。

  • 现在考虑相同的模块图,使用哈希文件名进行生产。在这里,我们生成了构建过程应用-8e0d62a03.mjs,部门-16f9d819a.mjs、和子部门-7be2aa47f.mjs从最初的三个文件中。

    如果我们升级或更改子部门.mjs,我们的构建过程将为生产版本重新生成一个新的文件名,例如子部门-5f47101dc.mjs。但这意味着我们需要改变进口的生产版本中的语句dep.mjs公司。这会更改其内容,这意味着dep.mjs公司它本身需要一个新的文件名。但这意味着我们需要更新进口的生产版本中的语句app.mjs应用程序...

也就是说,使用模块图和进口包含散列文件名脚本文件的语句,对图的任何部分的更新都会像病毒一样传播到它的所有依赖项,从而失去所有的可计算性优势。

导入映射通过解耦出现在进口来自服务器上URL的语句。例如,我们的站点可以从一个导入地图开始,如

{“导入”: {“/js/app.mjs”:"/js/应用程序-8e0d62a03.mjs",“/js/dep.mjs”:"/js/dep-16f9d819a.mjs",“/js/sub-dep.mjs”:"/js/sub-dep-7be2aa47f.mjs"}}

和具有以下形式的import语句导入“./sub-dep.mjs”而不是导入“./sub-dep-7be2aa47f.mjs”现在,如果我们改变子部门.mjs,我们只需更新导入地图:

{“导入”: {“/js/app.mjs”:"/js/app-8e0d62a03.mjs",“/js/dep.mjs”:"/js/dep-16f9d819a.mjs",“/js/sub-dep.mjs”:"/js/subledep-5f47101dc.mjs"}}

然后离开导入“./sub-dep.mjs”单独声明。这意味着dep.mjs公司不要改变,所以它会保持缓存状态;同样适用于app.mjs应用程序.

重新映射不适用于<脚本>

关于使用导入映射更改导入说明符的含义的一个重要注意事项是,它不会更改原始URL的含义,例如出现在<script src=“”><link rel=“modulepreload”>也就是说,在给定上述示例的情况下

进口 “./app.mjs”;

将在支持导入映射的浏览器中正确地重新映射到其哈希版本,

<脚本 类型="模块"型钢混凝土="./app.mjs文件"></脚本>

不会:在所有类别的浏览器中,它都会尝试获取app.mjs应用程序直接导致404。什么在支持导入地图的浏览器中

<脚本 类型="模块">进口 “./app.mjs”;</脚本>

范围界定示例

同一模块的多个版本

通常情况下,您希望使用相同的导入说明符来引用单个库的多个版本,具体取决于导入者。这封装了所使用的每个依赖项的版本,并避免了依赖地狱(更长的博客帖子).

我们通过允许您在给定的范围:

{“导入”: {“querystringify”:"/节点模块/querystringify/index.js"},“范围”: {“/node_modules/socksjs-client/”: {“querystringify”:"/node_modules/socksjs-client/querystringify/index.js"}}}

(这是几个例子中的一个实际示例@zkat提供的每个应用程序的多个版本。谢谢,@zkat!)

使用此映射,在URL以开头的任何模块内/节点模块/套接字js-客户端/,的“querystringify”说明符将引用/node_modules/socksjs-client/querystringify/index.js。否则,顶级映射将确保“querystringify”/节点模块/querystringify/index.js.

请注意,处于范围内并不会改变地址的解析方式;导入映射的基本URL仍在使用,而不是例如范围URL前缀。

范围继承

作用域以一种意图简单的方式相互“继承”,合并但在运行时覆盖。例如,以下导入映射:

{“导入”: {“a”:"/a-1毫米",“b”:"/b-1毫米",“c”:"/c-1.毫焦耳"},“范围”: {“/scope2/”: {“a”:"/a-2.毫焦耳"},“/scope2/scope3/”: {“b”:"/b-3.毫焦耳"}}}

将给出以下决议:

指定人 推荐人 结果URL
/范围1/foo.mjs /a-1.毫焦耳
b条 /范围1/foo.mjs /b-1.毫焦耳
c(c) /范围1/foo.mjs /c-1.毫焦耳
/范围2/foo.mjs /a-2.毫焦耳
b条 /范围2/foo.mjs /b-1.毫焦耳
c(c) /范围2/foo.mjs /c-1.毫焦耳
/范围2/scope3/foo.mjs /a-2.毫焦耳
b条 /范围2/scope3/foo.mjs /b-3.毫焦耳
c(c) /范围2/scope3/foo.mjs /c-1.毫焦耳

导入地图处理

安装

您可以使用<脚本>元素,内联或与src=“”属性:

<脚本 类型="导入映射">
{
  “导入”:{...},
  “范围”:{...}
}
</脚本>
<脚本 类型="导入映射"型钢混凝土="导入映射导入映射"></脚本>

src=“”属性,则生成的HTTP响应必须具有MIME类型应用程序/importmap+json.(为什么不重复使用应用程序/json? 这样做可能启用CSP旁路.)与模块脚本一样,请求是在启用CORS的情况下发出的,响应总是被解释为UTF-8。

因为它们影响所有导入,所以在完成任何模块解析之前,必须存在并成功获取所有导入映射。这意味着模块图获取在导入映射获取时被阻止。

这意味着导入映射的内联形式是强烈建议以获得最佳性能。这类似于内联关键CSS; 这两种类型的资源都会阻止应用程序执行重要的工作,直到它们被处理为止,因此引入第二个网络往返(甚至磁盘卡往返)是个坏主意。如果您决心使用外部导入映射,可以尝试使用HTTP/2 Push或捆绑式HTTP交换.

导入映射如何影响所有导入的另一个结果是,尝试添加一个新的<script type=“importmap”>启动任何模块图提取后都会出错。导入映射将被忽略<脚本>元素将激发错误事件。

目前只有一个<script type=“importmap”>页面上允许。一旦我们找到了组合多个导入映射的正确语义,我们计划在将来对此进行扩展。请参阅中的讨论#14,#137、和#167.

我们在工人中做什么?可能new Worker(someURL,{type:“module”,importMap:…})? 还是应该从工人内部设置?专职工作人员是否应该默认或始终使用其控制文档的映射?在中讨论#2.

动态导入地图示例

上述规则意味着你可以动态生成导入映射,只要您在执行任何导入之前这样做。例如:

<脚本>
常数 感应电动机 = 文件.创建元素('脚本');
感应电动机.类型 = '导入映射';
感应电动机.text内容 = JSON格式.纤细的({
  进口:{
    '我的图书馆':数学.随机的,随机的() > 0.5?“/我很棒的图书馆.mjs”:“/my-rad-library.mjs”
  }
});
文件.当前脚本.之后(感应电动机);
</脚本>

<脚本 类型="模块">
进口 “我的名字”; //将获取随机选择的URL
</脚本>

更现实的示例可能会使用此功能根据特征检测组装导入地图:

<脚本>
常数 导入地图 = {
  进口:{
    瞬间:'/mome.mjs',
    洛达什:一些功能检测()?'/lodash.mjs':“/lodash-legacy-browsers.mjs”
  }
};

常数 感应电动机 = 文件.创建元素('脚本');
感应电动机.类型 = '导入映射';
感应电动机.text内容 = JSON格式.纤细的(导入地图);
文件.当前脚本.之后(感应电动机);
</脚本>

<脚本 类型="模块">
进口 _  “lodash”; //将获取此浏览器的正确URL
</脚本>

注意(与其他<脚本>元素)修改的内容<script type=“importmap”>在它已经插入到文档中后将无法工作。这就是为什么我们在创建和插入<script type=“importmap”>.

范围

导入地图是应用程序级的东西,有点像服务工作者。(更正式地说,它们是每个模块的映射,因此是每个区域的映射。)它们不是用来组合的,而是由一个人或一个工具用一个整体的视图来制作的。例如,库中包含导入映射是没有意义的;库可以简单地按说明符引用模块,并让应用程序决定这些说明符映射到什么URL。

除了一般的简单性之外,这也是上述限制的部分原因<script type=“importmap”>.

由于应用程序的导入映射会更改模块映射中每个模块的解析算法,因此它们不受模块的源文本是否来自跨源URL的影响。如果从使用裸导入说明符的CDN加载模块,您需要提前知道该模块向应用程序添加了哪些裸导入说明符,并将它们包含在应用程序的导入映射中。(也就是说,您需要知道应用程序的所有可传递依赖项是什么。)重要的是,应用程序作者必须控制每个包使用的URL,这样他们才能全面管理模块的版本控制和共享。

与推测解析/获取的交互

大多数浏览器都有一个推测性的HTML解析器,它试图在HTML解析程序等待获取和执行阻塞脚本时发现HTML标记中声明的资源。这一点尚未明确,尽管在whatwg/html#5959。本节讨论了一些需要注意的潜在交互。

首先,请注意,尽管据我们所知,目前没有浏览器这样做,但推测解析器可能会获取https://example.com/foo.mjs在下面的示例中,当它等待阻塞脚本时https://example.com/blocking-1.js(网址:https://example.com/blocking-1.js):

<!DOCTYPE html>
<!-- 此文件是https://example.com/ -->
<脚本 型钢混凝土="阻塞-1.js"></脚本>
<脚本 类型="模块">
进口 “./foo.mjs”;
</脚本>

类似地,浏览器可以推测获取https://example.com/foo.mjshttps://example.com/bar.mjs在以下示例中,通过将导入映射解析为推测解析过程的一部分:

<!DOCTYPE html>
<!-- 此文件是https://example.com/ -->
<脚本 型钢混凝土="阻塞-2.js"></脚本>
<脚本 类型="导入映射">
{
  “导入”:{
    “foo”:“./foo.mjs”,
    "https://other.example/bar.mjs":“./bar.mjs”
  }
}
</脚本>
<脚本 类型="模块">
进口 “foo”;
进口 "https://other.example/bar.mjs";
</脚本>

这里需要注意的一个交互作用是,对于这个示例,那些推测性地解析内联JS模块但不支持导入映射的浏览器可能会进行错误的推测:它们可能会推测性地获取https://other.example/bar.mjs,而不是https://example.com/bar.mjs它被映射到。

更普遍地说,基于进口地图的推测可能会像其他推测一样出现同样的错误。例如,如果阻塞-1.js

常数 埃尔 = 文件.创建元素(“基础”);
埃尔.href公司 = “/子目录/”;
文件.当前脚本.之后(埃尔);

然后是投机https://example.com/foo.mjs在no-import映射示例中会浪费时间,因为到了对模块进行实际计算的时候,我们需要重新计算相对说明符“./foo.mjs”并意识到实际要求的是https://example.com/subdirectory/foo.mjs.

对于导入映射案例,如果阻塞-2.js

文件.(`<script type=“importmap”>
{
“进口”:{
“foo”:“./other foo.mjs”,
"https://other.example/bar.mjs(其他示例)": "./other-bar.mjs“
}
}
</script>`);

然后是投机行为https://example.com/foo.mjshttps://example.com/bar.mjs将被浪费,因为新编写的导入映射将生效,而不是HTML中内联的导入映射。

<基础>要素

什么时候?<基础>元素,则导入映射中的所有URL和类URL说明符都将使用href公司<基础>.

<基础 href公司="https://www.unpkg.com/vue/dist/">
<脚本 类型="导入映射">
{
  “导入”:{
    “视觉”:“./vue.runtime.esm.js”,
  }
}
</脚本>

<脚本>
进口(“视觉”); //决心https://www.unpkg.com/vue/dist/vue.runtime.esm.js
</脚本>

特征检测

如果浏览器支持HTML脚本元素支架(类型)方法,HTMLScriptElement.supports('importmap')必须返回true。

如果 (HTML脚本元素.支架 && HTML脚本元素.支架('导入映射')) {
  慰问.日志('您的浏览器支持导入地图。');
}

考虑的备选方案

Node.js模块解析算法

与Node.js不同,在浏览器中,我们没有一个合理的快速文件系统,我们可以爬行查找模块。因此,我们无法实现节点模块解析算法直接;它需要为每个进口语句,浪费带宽和时间,因为我们继续获得404秒。我们需要确保进口语句只导致一个HTTP请求;这就需要进行一些预计算。

可编程分辨率挂钩

一些人建议使用JavaScript挂钩来解释每个模块说明符,定制浏览器的模块解析算法。

不幸的是,这对性能是致命的;为模块图的每一条边跳入和退出JavaScript会大大降低应用程序的启动速度。(典型的web应用程序有数千个模块的数量级,其中有3-4倍的导入语句。)你可以想象各种缓解措施,比如将调用限制为仅使用裸导入说明符,或者要求钩子接受一批说明符并返回一批URL,但最终没有什么比预计算更好的了。

另一个问题是,很难想象web开发人员可以编写一个有用的映射算法,即使他们被赋予了这个挂钩。Node.js有一个,但它是基于反复爬网文件系统并检查文件是否存在;如上所述,这在网上是不可行的。通用算法唯一可行的情况是:(a)您从未需要对子图进行定制,即您的应用程序中只存在每个模块的一个版本;(b) 工具设法以某种统一、可预测的方式提前安排模块,例如,算法变成“返回”/js/${说明符}.js“。但如果我们身处这个世界,声明式解决方案会更简单。

提前重写

目前使用的一种解决方案(例如取消包装CDN通过babel-plugin-unpkg公司)是使用构建工具提前将所有裸导入说明符重写为其相应的绝对URL。这也可以在安装时完成,因此当您使用npm安装包时,它会自动重写包的内容,以使用绝对或相对URL,而不是纯导入说明符。

这种方法的问题是它不适用于动态导入(),因为无法静态分析传递给该函数的字符串。您可以插入修复程序,例如更改导入(x)进入之内import(说明符ToURL(x,import.meta.url)),其中说明符ToURL是构建工具生成的另一个函数。但最终这是一个相当漏洞百出的抽象说明符ToURL无论如何,function在很大程度上重复了该提案的工作。

服务人员

乍一看,服务人员似乎是进行这种资源翻译的合适场所。我们在过去讨论过寻找某种方法来将说明符与服务工作者的获取事件一起传递,从而允许它返回适当的响应.

然而,首次装载时服务人员不可用因此,它们不可能真正成为用于加载模块的关键基础设施的一部分。它们只能用于在通常情况下正常工作的获取之上进行渐进增强。

基于约定的平面映射

如果您有一个不需要作用域依赖项解析的简单应用程序,并且有一个包安装工具,可以轻松地重写包内磁盘上的路径(与当前版本的npm不同),那么您可以使用更简单的映射。例如,如果您的安装工具创建了表单的平面列表

节点_模块_平台化/洛达什/索引.js核心.jsfp.js格式力矩/索引.jshtml到dom/索引.js

那么你唯一需要的信息就是

  • 基本URL(在我们的应用程序中,/节点_模块_平台化/)
  • 使用的主模块文件名(在我们的应用程序中,索引.js)

您可以想象一个模块导入配置格式只指定了这些内容,甚至只指定了一些子集(如果我们对其他内容进行假设的话)。

这种想法不适用于需要范围解析的更复杂的应用程序,因此我们认为完整的导入映射建议是必要的。但对于简单的应用程序来说,它仍然很有吸引力,我们想知道是否有一种方法可以使提案具有一种简单的模式,即不需要列出所有模块,而是依赖于约定和工具来确保所需的最小映射。在中讨论#7.

相邻概念

为每个模块提供带外元数据

现在有好几次人们希望为每个模块提供元数据;例如,完整性元数据,或获取选项。尽管有人建议通过导入声明来实现这一点,仔细考虑选项导致首选带外清单文件。

导入映射能够就是那个清单文件。然而,由于以下几个原因,它可能不是最合适的:

  • 正如当前设想的那样,应用程序中的大多数模块在导入映射中都没有条目。主要用例用于需要由裸说明符引用的模块,或者需要执行一些复杂操作(如聚合填充或虚拟化)的模块。如果我们设想每个模块都在地图中,那么我们就不会包括诸如packages-via-trailing-slashes之类的便利功能。

  • 到目前为止,所有建议的元数据都适用于任何类型的资源,而不仅仅是JavaScript模块。解决方案可能在更一般的级别上工作。

进一步的工作

多导入映射支持

这是自然的多<script type=“importmap”>s显示在页面上,就像多个<脚本>其他类型的可以。我们希望在未来实现这一点。

这里最大的挑战是决定多个导入映射是如何组成的。也就是说,如果两个导入映射都重新映射相同的URL,或者两个范围定义覆盖相同的URL前缀空间,那么对页面的影响是什么?目前的主要候选人是级联分辨率,它将导入映射从导入说明符→URL映射重铸为一系列级联的导入说明器→导入说明灯映射,最终在“可提取导入说明词”(本质上是一个URL)中降到最低点。

请参阅这些悬而未决的问题以供更多讨论。

编程API

一些用例需要一种从脚本读取或操作领域导入映射的方法,而不是通过插入声明性<script type=“importmap”>元素。考虑一下它是一个“导入映射对象模型”,类似于CSS对象模型,它允许用户操作页面通常是独立的CSS规则。

这里的挑战是如何协调声明性导入映射与任何编程更改,以及在页面生命周期中这样的API何时可以运行。一般来说,简单的设计功能较弱,可能满足的用例更少。

请参阅这些未决问题以了解编程API可以提供帮助的更多讨论和用例。

import.meta.resolve()

提议的import.meta.resolve(说明符)函数允许模块脚本随时将导入说明符解析为URL。请参阅whatwg/html#5572了解更多信息。这与导入映射有关,因为它允许您解析“包相关”资源,例如。

常数 网址 = 进口..决定(“somepackage/resource.json”);

会给你合适的地图位置资源.json一些包裹/由页面导入映射控制的命名空间。

社区填充物和工具

该社区的一些成员一直在研究与导入地图相关的polyfill和工具。以下是我们知道的:

请随时发送拉请求和更多!此外,您可以使用#146在问题跟踪中讨论此空间。

鸣谢

本文档源于为期一天的sprint,涉及@圆顶的,@广岛-g,@贾斯汀法尼尼,@MylesBorins公司、和@尼亚克斯特。从那时起,@盖贝德福德在原型设计和推动对该提案的讨论方面发挥了重要作用。

还要感谢问题跟踪器上的所有贡献者,感谢他们在制定提案方面的帮助!