javascript - 使用 JavaScript 模块的同构 JavaScript 库 - 在浏览器中省略 Node.js 依赖项?
问题描述
所以我计划编写一个包,希望用户能够在 Node.js 和浏览器中使用它。
在 Node.js 端,它将使用该fs
模块。这在浏览器中可能不存在。这可以通过 CommonJS 来完成,它带有一个if
检查模块所在环境的子句和一个简单的require
.
import
当它被吊起时,情况并非如此。
有没有人知道如何构造代码或构建环境以满足同一个包中的两个环境?
解决方案
坚持 ES6 导入
似乎import
对 Node.js 的支持有所改进。在文档中它说:
该
--experimental-modules
标志可用于启用对 ECMAScript 模块(ES 模块)的支持。一旦启用,Node.js 将在将以下内容作为 ES 模块传递给节点作为初始输入时,或者在 ES 模块代码中的 import 语句引用时:
.mjs
以.结尾的文件当最近的父文件包含值为 的顶级字段时,以 结尾的
.js
文件或无扩展名文件。package.json
"type"
"module"
字符串作为参数传入
--eval
orSTDIN
,带有标志--input-type=module
。
列出的第二种方法可能适用于 node.js。只需确保您的库package.json
包含"type": "module"
并且 Node 应该将其视为 ES6 模块而不是 CommonJS。
有条件的导入作为承诺 - 你将不得不等待
条件导入在节点中已经可用,但实际上并不支持。他们似乎在浏览器中工作。还有一个警告:导入的模块是一个承诺。这意味着只要您计划好您的步骤,您就可以拥有部分同构的代码。知道您可以import("test.js")
在浏览器中执行并且可以测试window
意味着您可以以智能的方式编写条件并拥有跨平台代码。
例如,您可以这样做:
if (typeof window !== 'undefined') const FooPromise = import("foo");
但不是相反。祝你好运。希望对 es6 动态导入的更多支持将来到节点。
推荐阅读
- javascript - 使用 XHR 的结果重新填充 DataTables 表
- powerbi - 无法获得区域计数的百分比
- python - 需要帮助理解 PyQt5 中的继承
- python - 多次计算DF中每个项目的两点之间的距离
- ios - 自动调整 UICollectionView 单元格大小,将单元格对齐到顶部
- python - 在python中将链接刮到熊猫数据框中
- php - PHP中的条件更新SQL语句
- mysql - CSV 列中的 STR_TO_DATE 返回 Null
- sql - 根据 ID 条件连接两个表,并且第一个表中的日期介于另一个表中的其他两个日期之间
- react-native - 如何将应用程序的当前状态传递到选项卡导航屏幕