javascript - Webpack 从同构组件延迟加载模块(服务器和客户端之间的共享代码)
问题描述
假设我有一个节点快速服务器和一个客户端 JavaScript 应用程序。
两者共享相同的组件。
客户端 javascript 通过 webpack 捆绑。
自然有一些库只在客户端需要。
问题是如何配置 webpack 以延迟加载这些模块。
当我只有一个客户端应用程序时,我在一个只能在客户端调用的函数中使用它:
await import( /* webpackChunkName: "tinymce" */ 'tinymce' );
连同使用chunkFilename:
webpacks 输出指令中的选项,这导致模块仅在请求时加载。
不幸的是,这在使用节点运行代码时不起作用,因为导入方法不可用。
如果我现在在函数内使用等效的节点调用:
require( 'tinymce' );
Webpack 将整个依赖项包含在入口点中,并且不再拆分块。
在服务器和客户端之间共享代码库时如何使用模块的延迟加载,而不必同时转换节点代码?
解决方案
它可以在节点内和客户端重用相同的代码,而无需转换服务器端代码。
它通过使用require.ensure()
而不是仅起作用require()
:
// Returns a promise that resolves with the Module
require.ensure( [], ( require ) => require( 'pikaday' ) )
Node 不会抱怨,如果您chunkFilename
在webpack.config.js
output
指令中定义 a,webpack 会成功地将模块放入自己的文件中,该文件将在必要时加载。
我只用我只在客户端需要的模块对此进行了测试,并通过检查typeof document === 'object'
asrequire.ensure
实际上不是标准方法而是特定于 webpack 来有条件地调用它们。因此,如果您在客户端和服务器端都需要一个模块,它可能不起作用,尽管您可以尝试使用 polyfill for require.ensure for node。
推荐阅读
- python - 列表编号不会重新启动
- c++ - 在 GFG 上的 Partition Equal Subset sum 中得到错误的答案
- azure - AspNetCoreRateLimit 无法在 Azure 上工作
- openstreetmap - 如何在 OSM 的 nominatim API 中添加门牌号
- reactjs - 用 Require 图像开玩笑
- ios - 如何使用 Apple Music API 按流派/类别获取歌曲
- .net - 找不到框架“Microsoft.WindowsDesktop.App”,版本“5.0.0”
- php - 在 PHP 中具有适当小数支持的自然数组排序
- microsoft-edge - 如何永久更改 Microsoft Edge 中的默认用户代理
- jira-rest-api - 如何在创建问题 rest api 中使用 Atlassian 文档格式