iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >如何动态引入DynamicImport
  • 150
分享到

如何动态引入DynamicImport

2023-07-04 23:07:59 150人浏览 八月长安
摘要

本篇内容介绍了“如何动态引入DynamicImport”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是动态引入(DynamicImpor

本篇内容介绍了“如何动态引入DynamicImport”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

    什么是动态引入(DynamicImport)?

    本文介绍的动态引入实现方式基于 rollup 插件 @rollup/plugin-dynamic-import-vars

    通常情况下,我们都是通过确定的字面量路径来引用文件模块的,例如:

    import './a.js';require('./a.js');import('./a.js');

    对于确定的文件路径来说,构建工具可以轻易的抓取文件并进行相关的转换。

    但当import或者require的目标不是一个静态字符串,而是一个动态表达式时,构建工具其实也不确定用户到底引用了什么,所以通常这种情况只能依靠 javascript 的运行时来解析。

    若动态表达式实际代表的路径无法被解析,则运行时会引起控制台的错误。通常是因为生成的文件路径并没有被纳入打包体系,所以找不到文件。

    下面列出了一些常见的动态引入表达式:

    // TemplateLiteral 模板字符串import(`./icons/arrow-${type}.svg`);require(`./icons/arrow-${type}.svg`);// BinaryExpression 二元表达式import('./icon/arrow-' + type + '.svg');// 直接引用一个变量import(path);require(path)

    但经过前人们的实践发现,当动态表达式满足一定的结构时,构建工具便可以通过一些特殊手段抓取并打包路径匹配的相关文件,并自动注入一些 polyfill,从而实现动态引入(DynamicImport)的效果,也就是本文的主题。

    动态引入的实现原理

    本节内容翻译加工自 @rollup/plugin-dynamic-import-vars README.md 部分章节

    当动态导入的路径中包含变量时,经过 AST 分析可以生成对应的通配符。在构建的时候,这些通配符将被用于抓取匹配的文件。随后这些文件会被添加进构建体系中,在运行时,根据导入的实际路径返回对应的文件内容。

    下面是一些通配符的转换示例:

    `./locales/${locale}.js` -> './locales*.js'`./module-${name}.js` -> './module-*.js'`./modules-${name}/index.js` -> './modules-*/index.js''./locales/' + locale + '.js' -> './locales*.js'

    待转换的代码可能是这样的:

    function importLocale(locale) {  return import(`./locales/${locale}.js`);}

    经过转换后它会变成下面这样:

    function __variableDynamicImportRuntime__(path) {  switch (path) {    case './locales/en-GB.js':      return import('./locales/en-GB.js');    case './locales/en-US.js':      return import('./locales/en-US.js');    case './locales/nl-NL.js':      return import('./locales/nl-NL.js');    default:      return new Promise(function (resolve, reject) {        queueMicrotask(reject.bind(null, new Error('Unknown variable dynamic import: ' + path)));      });  }}function importLocale(locale) {  return __variableDynamicImportRuntime__(`./locales/${locale}.js`);}

    可以看到,实际的 import 被替换成了注入的 __variableDynamicImportRuntime__ 函数,该函数会根据运行时拼接的具体字符串返回对应的打包文件。

    动态引入的限制

    本节内容翻译加工自 @rollup/plugin-dynamic-import-vars README.md 部分章节

    为了知道要在代码中注入什么,我们必须能够对代码进行一些静态分析,并对可能的导入做出一些假设。例如,如果只使用一个变量,理论上可以从整个文件系统中导入任何内容。

    function importModule(path) {  return import(path); // 这根本无法推断引入了什么}

    为了能够实现静态分析,并避免可能出现的问题,动态引入的实现上限定了一些规则:

    Import 路径须为相对路径

    所有导入都必须相对于导入文件进行。导入不应该是纯变量、绝对路径或裸导入:

    // Not allowedimport(bar); // 纯变量import(`/foo/${bar}.js`); // 绝对路径import(`${bar}.js`); // 裸导入import(`some-library/${bar}.js`); // 裸导入

    引用路径需包含文件后缀

    文件夹中可能包含你不打算导入的文件。因此,我们要求导入的静态部分以文件扩展名结束

    import(`./foo/${bar}`); // Not allowedimport(`./foo/${bar}.js`); // Allowed

    导入当前目录的文件需要指定具体的文件匹配格式

    如果你从当前目录导入文件,很可能会导入一些原本不打算导入的文件,包括书写代码的这个文件本身。因此这种情况下需要给出一个更具体的文件名匹配格式:

    import(`./${foo}.js`); // not allowedimport(`./module-${foo}.js`); // allowed

    通配符(Glob Pattern)仅有一层深度

    在生成通配符时,字符串中的每个变量都会被转换为通配符中的*,每个层级的目录最多一个星号。这避免了无意中从更多的目录中添加文件到导入中。

    下面的例子中,最终将会生成 ./foo.js

    import(`./foo/${x}${y}/${z}.js`);

    核心流程解读

    插件核心转换代码仅有 100 行,且非常易懂 —— plugins/index.js at master · rollup/plugins

    整体流程分为以下几步:

    通过 AST 分析,拿到对应的导入路径,也就是 import 表达式括号中的源码部分。

    对这部分的源码进行处理,调用 dynamicImportToGlob 函数

    执行上述限制条件的判断,尝试获取一个合法的通配符。

    如果通配符不合法,将会引发错误,终止进程。

    执行通配符,抓取相关文件。

    替换 import 表达式,并注入 __variableDynamicImportRuntime__ 函数。

    附上插件核心转换代码的截图。

    如何动态引入DynamicImport

    “如何动态引入DynamicImport”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

    --结束END--

    本文标题: 如何动态引入DynamicImport

    本文链接: https://www.lsjlt.com/news/348172.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • 如何动态引入DynamicImport
      本篇内容介绍了“如何动态引入DynamicImport”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是动态引入(DynamicImpor...
      99+
      2023-07-04
    • 动态引入DynamicImport实现原理
      目录什么是动态引入(DynamicImport)?动态引入的实现原理动态引入的限制Import 路径须为相对路径引用路径需包含文件后缀导入当前目录的文件需要指定具体的文件匹配格式通配...
      99+
      2023-01-08
      动态引入DynamicImport DynamicImport 原理
    • vuex如何动态引入storemodules
      目录动态引入store modules我的目录结构是使用modules时遇到的坑动态引入store modules 主要解决的问题每次建一个module需要自己去主index.js里...
      99+
      2024-04-02
    • vue如何动态引入img标签
      在vue中动态引入img标签的方法:1.新建vue.js项目;2.添加img标签并提供地址;3.配置config.js文件;4.在项目中应用配置文件;具体步骤如下:首先,在vue-cli中创建一个vue.js项目;vue create pr...
      99+
      2024-04-02
    • vuex怎么动态引入store modules
      这篇文章主要为大家展示了“vuex怎么动态引入store modules”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“vuex怎么动态引入store modules”这篇文章...
      99+
      2023-06-29
    • vue3动态加载组件以及动态引入组件详解
      目录1.问题2.分析3.最后总结1.问题 在做一个用vite构建的vue3项目时,动态拉取导入.vue页面,然后控制台一直有以下提示,页面也无法渲染出来。 2.分析 根据上面的报错...
      99+
      2023-03-23
      vue 动态加载组件 vue加载组件 vue3动态加载组件
    • vue中如何引入html静态页面
      目录vue中引入html静态页面vue中引入html静态页面的一些问题1.最直接的方法就是在vue中嵌入html文件2.第二种方法window.open(url)总结vue中引入ht...
      99+
      2023-01-16
      vue引入html静态页面 vue引入html html静态页面
    • vue3动态加载组件及动态引入组件怎么使用
      本篇内容介绍了“vue3动态加载组件及动态引入组件怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.问题在做一个用vite构建的vu...
      99+
      2023-07-05
    • vue引入静态jquery报错如何解决
      这篇文章主要介绍“vue引入静态jquery报错如何解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vue引入静态jquery报错如何解决”文章能帮助大家解决问题。vue引入静态jquery报错的...
      99+
      2023-07-05
    • javascript如何动态导入ECMAScript模块
      小编给大家分享一下javascript如何动态导入ECMAScript模块,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧! ECMAScript(又名ES2015...
      99+
      2024-04-02
    • 动态sql如何防止sql注入
      动态sql防止sql注入的示例:在对应的数据库中添加以下sql语句:DECLARE @variable NVARCHAR(100)DECLARE @SQLString NVARCHAR(1024)DECLARE @ParmD...
      99+
      2024-04-02
    • Vue3+TypeScript+Vite使用require动态引入图片等静态资源
      问题:Vue3+TypeScript+Vite的项目中如何使用require动态引入类似于图片等静态资源! 描述:今天在开发项目时(项目框架为Vue3+TypeScript+Vite...
      99+
      2024-04-02
    • diango引入静态文件
      web开发需要使用到css和javascript文件,才能让网页展示比较好看。下面介绍在Django框架中引入这些静态文件,来实现一个bootstrap网页。首先,在你建立的工程的根目录中建立一个static文件夹,用来存放css,js和图...
      99+
      2023-01-30
      静态 文件 diango
    • 如何引入css
      这篇文章主要介绍了如何引入css,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1.内联式引用:直接用在标签上,但维护成本高style='font-size:16px;...
      99+
      2023-06-08
    • 静态页面如何实现include引入公用代码
      小编给大家分享一下静态页面如何实现include引入公用代码,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一直以来,我司的前端都...
      99+
      2024-04-02
    • Vue组件如何自动按需引入详析
      目录全局注册局部注册局部自动注册不同方案对比关于组件名参考总结在Vue中我们可以通过全局组件、局部注册的方式来使用组件 全局注册 通过app.component来创建全局组件 i...
      99+
      2024-04-02
    • Vue如何实现动态渲染input输入框
      本文小编为大家详细介绍“Vue如何实现动态渲染input输入框”,内容详细,步骤清晰,细节处理妥当,希望这篇“Vue如何实现动态渲染input输入框”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。问题描述就比如现在...
      99+
      2023-07-04
    • vue如何引入qs
      在vue中引入qs的方法:1.新建vue.js项目;2.使用npm安装qs依赖包;3.使用import方法引入qs;具体步骤如下:首先,在vue-cli中创建一个vue.js项目;vue create project-namevue.js项...
      99+
      2024-04-02
    • vue如何引入vantui
      在vue中引入vantui的方法:1.新建vue.js项目;2.使用npm安装vantui依赖包;3.配置.babelrc文件;4.使用import方法引入vantui;具体步骤如下:首先,在vue-cli中创建一个vue.js项目;vue...
      99+
      2024-04-02
    • vue如何引入svg
      在vue中引入svg的方法:1.新建vue.js项目;2.使用npm命令安装svg依赖;3.配置config文件;4.使用import方法导入svg组件;具体步骤如下:首先,在vue-cli中创建一个vue.js项目;vue create ...
      99+
      2024-04-02
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作