首页 > 其他分享 >Import maps

Import maps

时间:2023-05-15 09:00:38浏览次数:52  
标签:https lodash 映射 maps 模块 import Import dayjs

当 ES Module 最开始作为一种新的 JavaScript 模块化方案在 ES6 中被引入的候,其实是通过在 import 语句中强制指定相对路径或绝对路径来实现的。

import dayjs from "https://cdn.skypack.dev/[email protected]"; // ES modules console.log(dayjs("2022-08-12").format("YYYY-MM-DD"));

这和其他常见的模块化系统(例如 CommonJS)的工作方式略有不同,并且在使用像 webpack 这样的模块打包工具的时候会使用更简单的语法:

const dayjs = require('dayjs') // CommonJS import dayjs from 'dayjs'; // webpack

在这些系统里,模块导入语句通过 Node.js 运行时或相关构建工具映射到特定(版本)的文件。用户只需要在 import 语句中直接编写模块说明符(通常是包名),模块就可以自动处理。

由于开发人员已经熟悉了这种从 npm 导入包的方式,因此必须要先经过一个的构建步骤才能确保以这种方式编写的代码可以在浏览器中运行。

Import maps 就可以解决这个问题,它可以将模块说明符(包名)自动映射到它的相对或绝对路径。从而让我们不使用构建工具也能使用简洁的模块导入语法。

如何使用 Import maps

我们可以通过 HTML 中的 <script type="importmap"> 标签来指定一个 Import maps

<script type="importmap"> {   "imports": {     "dayjs": "https://cdn.skypack.dev/[email protected]",   } } </script>

为了成功的在模块解析之前对其进行解析。这个 script 标签必须放在文档中第一个 <script type="module"> 标签之前(最好放在 <head>中),另外,目前每个 HTML 只允许编写一个 Import maps 。

<script type="module">  import dayjs from 'dayjs';   console.log(dayjs("2022-08-12").format("YYYY-MM-DD"));</script>

在 script 标签内,我们可以通过一个 JSON 对象来为文档中的脚本所需导入的模块指定所有必要的映射。一个典型的 importmap 结构如下所示:

<script type="importmap"> {   "imports": {     "react": "https://cdn.jsdelivr.net/npm/react/umd/react.production.min.js",     "react-dom": "https://cdn.jsdelivr.net/npm/react-dom/umd/react-dom.production.min.js"    "square": "./modules/square.js",     "lodash": "/node_modules/lodash-es/lodash.js"   } } </script>

在上面的 import 对象中,每个属性对应一个映射。映射的左侧是导入说明符的名称(一般是包名),而右侧是说明符需要映射到的相对或绝对路径。在映射中指定相对路径时,必须要确保它们始终以 /、../或 ./ 开头。

另外,importmap 中声明的包并不一定意味着它一定会被浏览器加载。页面上的脚本没有使用到的任何模块都不会被浏览器加载,即便你在 importmap 中声明了它。

编写好 importmap 之后,你就可以在后面的脚本中直接使用 ES Module 语法了。

<script type="module">  import { cloneDeep } from 'lodash';   const objects = [{ a: 1 }, { b: 2 }];   const deep = cloneDeep(objects);   console.log(deep[0] === objects[0]);</script>

外部映射

你还可以在外部文件中指定你的映射,然后使用 script 的 src 属性链接到这个文件(Content-Type Header 必须要设置为 application/importmap+json 才能正常加载)。

<script type="importmap" src="importmap.json"></script>

不过尽量不要使用这种方式,因为它的性能比直接内联编写要差。

映射整个包

除了将一个说明符映射到模块之外,你还可以将一个说明符映射到包含多个模块的包:

<script type="importmap"> {   "imports": {     "lodash/": "/node_modules/lodash-es/"   } } </script>

这种编写方式可以让你直接导入指定路径中的任何模块,相应的,浏览器也会把所有组件模块下载下来。

<script type="module">  import toUpper from 'lodash/toUpper.js';   import toLower from 'lodash/toLower.js';   console.log(toUpper('ConardLi'));   console.log(toLower('ConardLi'));</script>

动态映射

你也可以基于一些条件在 script 中添加一个动态映射,比如,在下面的示例中我们通过判断是否存在 IntersectionObserver API 来导入不同文件:

<script>  const importMap = {     imports: {       lazyload: 'IntersectionObserver' in window         ? './lazyload.js'         : './lazyload-fallback.js',     },   };   const im = document.createElement('script');   im.type = 'importmap';   im.textContent = JSON.stringify(importMap);   document.currentScript.after(im);</script>

使用同一模块的不同版本

使用 importmap 我们可以将不同的版本的模块映射到不同的包名中:

<script type="importmap">      {         "imports": {           "lodash@3/": "https://unpkg.com/[email protected]/",           "lodash@4/": "https://unpkg.com/[email protected]/"         }       }    </script>

另外你还可以通过 scopes 来实现同一个包不同模块的更细粒度的版本控制:

<script type="importmap">  {     "imports": {       "lodash/": "https://unpkg.com/[email protected]/"     },     "scopes": {       "/static/js": {         "lodash/": "https://unpkg.com/[email protected]/"       }     }   }</script>

/static/js 下的模块会使用 3.10.1 版本,而其他模块会使用 4.17.21 版本。

兼容性

图片

这项技术目前在 Chrome 和 Edge 浏览器 89 及更高版本提供了全面支持,但 Firefox、Safari 和一些移动浏览器还没有支持。我们可以通过下面的代码来判断浏览器的支持情况:

if (HTMLScriptElement.supports && HTMLScriptElement.supports('importmap')) {   // import maps is supported }

对于没有提供支持的浏览器,我们可以使用下面这个 polyfillhttps://github.com/guybedford/es-module-shims

另外官方也推荐了一些其他 importmap 相关的 polyfill 和工具:

图片

https://github.com/WICG/import-maps#community-polyfills-and-tooling

参考

标签:https,lodash,映射,maps,模块,import,Import,dayjs
From: https://www.cnblogs.com/kitebear/p/17400795.html

相关文章

  • gym 加载/获取 其它模块/库的自定义环境 为什么不需要import自定义的模块/库 只需impo
    site-packages\gymnasium\__init__.py#Hooktoloadpluginsfromentrypointsload_plugin_envs()在这里载入的其它模块/库的自定义环境 Loadmodules(plugins)usingthegymnasiumentrypointsinordertoregisterexternalmodule'senvironmentson``importgymna......
  • Docker命令之export|import、save|load
    1、export|importexportdockerexport-o/ly/myexport-redis49c26f7431d1-o:指定一个不存在的文件夹,存放导出的镜像import#格式dockerimport[OPTIONS]file|URL|-[REPOSITORY[:TAG]]#例如dockerimport/ly/myexport-redisexportredis:v1注意:我们使用expo......
  • import CSV with X++ for Dynamics 365 FO
    ///<summary>///importcolorcode///</summary>classCFSImportColorCode{    ///<summary>    ///main    ///</summary>    ///<paramname=“_args”>_args</param>   publicstaticvoidmain(Args_args)   { ......
  • django-datatable-view==0.9.0 Django 3.1.3: ImportError:无法导入名称'FieldDoesNot
    问题答案来自于:https://cloud.tencent.com/developer/ask/sof/891274源码:fromdjango.db.models.fieldsimportFieldDoesNotExist 替换:fromdjango.core.exceptionsimportFieldDoesNotExist......
  • RUL预测常用数据集--C-MAPSS Dataset介绍
    C-MAPSS是针对航空发动机剩余寿命预测的数据集。该数据集由NASA(美国国家航空航天局)发布,包含了四个不同类型的航空发动机的传感器数据,以及相应的故障模式和剩余寿命数据,如表1所示。表1InformationoftheC-MAPSSdataset.DatasetFD001FD002FD003FD004Engineunit......
  • 页面引入css样式时,使用link和@import有什么区别
    css文件引入的方式有两种:1.HTML中使用link标签<linkrel="stylesheet"href="style.css/>2.css中使用@import@import"style.css"/*使用字符创*/@importurl("style.css")/*使用url地址*/link和@import区别link属于HTML标签,除了加载css外,还可以做很多其的他事,比......
  • python 为什么在python脚本中import就可以引用别人的包
    目录python为什么在python脚本中import就可以引用别人的包编写一个包打包。发布到PyPIpython为什么在python脚本中import就可以引用别人的包Python中的import语句可以将已有的代码模块导入到当前的程序中,方便我们复用代码。如果你想让别人在其电脑上导入你写的包,有以下几......
  • @Import注解原理源码分析
    文章结构@Import注解源码的入口位置@Import注解原理收集@Import注解处理收集的imports@Import注解源码的入口位置源码的入口位置在ConfigurationClassParser#doProcessConfigurationClass方法中,至于为什么是这个位置,先按下不表后续会填坑完善。Spring如何解析配置类先简单看下Spr......
  • ImportError: numpy.core.multiarray failed to import (import pyBigWig)
     ---------------------------------------------------------------------------RuntimeErrorTraceback(mostrecentcalllast)RuntimeError:modulecompiledagainstAPIversion0x10butthisversionofnumpyis0xd.Checkthe......
  • go语言 数组和切片、可变长参数、maps、字符串、指针、结构体、方法、接口
    数组和切片数组#1定义,初始化,使用#2数组是值类型数字,字符串,布尔,数组,都是值类型,真正直接存数据切片,map,指针引用类型,是个地址,指向了具体的值#3数组长度#4循环打印数组#5多纬数组#6数组定义并赋初值,把第99赋值为1,其他都是0#数组的长度也......