如何热重载包装在本机导入上下文中的模块?

Posted

技术标签:

【中文标题】如何热重载包装在本机导入上下文中的模块?【英文标题】:How do I hot reload a module wrapped in a native import context? 【发布时间】:2019-09-28 20:43:05 【问题描述】:

我有如下函数一个文件@/lang/index.js:

async function fetchMessages(locale) 
  const module = await import(/*
    webpackChunkName: "lang/[request]",
    webpackExclude: /index/
  */ `@/lang/$locale`)

  return module.default

我想热重载这个函数导入的模块。我尝试了几种不同的 module.hot.accept() 变体,但都没有成功。

这是我在同一文件末尾的热重载代码,但不起作用:

if (process.env.NODE_ENV !== "production" && module.hot) 
  module.hot.accept(["./en-US"], () => 
    const  locale  = i18n
    fetchMessages(locale).then((strings) => 
      i18n.setLocaleMessage(locale, strings)
    )
  )

有什么想法吗?我想在检测到更改时热重新加载我的语言文件。

谢谢!

【问题讨论】:

我找到了问题的根源,index.js 不是en-US.js 的直接父母。对于每个import() 表达式,都会创建一个新的“模块”。如果我为该模块使用 Webpack 的内部标识符 ("./src/lang lazy recursive ^\\.\\/.*$ exclude: index"),那么它将起作用,但编译器会尝试将该字符串解析为模块并引发错误。 【参考方案1】:

Webpack 目前有一个针对此“错误”的未解决问题。经过一番搜索,我找到了Webpack#8637。

该页面的一些解决方法包括:

创建一个包含导入上下文的单独文件,接受该单独文件。 使用module.hot.accept(module.children[0].id, ...)

我目前使用的解决方案是找到生成的上下文标识符,并将其保存到一个变量中,然后传递给module.hot.accept(),如下所示:

const asyncChunkId = "./src/lang lazy recursive ^\\.\\/.*$ exclude: index"
module.hot.accept(asyncChunkId, () =>  /* ... */ )

它相当脆弱,但现在可以完成这项工作。

【讨论】:

以上是关于如何热重载包装在本机导入上下文中的模块?的主要内容,如果未能解决你的问题,请参考以下文章

Python中的Tkinter OpenGL上下文

如何轻松更改上下文?

什么是热刷新?

错误:在渲染器中加载非上下文感知本机模块:@serialport\bindings\build\Release\bindings.node'

核心数据重载数据库

实时重载、热重载和热模块更换之间的概念区别是啥?