【发布时间】:2021-08-25 16:24:16
【问题描述】:
我是一名 JavaScript 初学者。我不使用“捆绑器”。
几天来,我一直在尝试在某些 JavaScript 中使用 moment.js 和其他日期时间库,方法是使用 ES6 模块 (ESM) 导入它。
我有一个我写的 JS 模块,它是从 TS 转译的,它有这样一行:
import moment from "../lib/moment/src/moment.js"
我的模块本身是通过从 <script type="module" > 标记的导入加载的,这很有效。
我发现 moment 包在其 src 文件夹中包含看起来像“源”代码的东西,看起来更像我习惯的 JS/TS,并且在底部。
所以我在转译的 JS 模块中引用了那个“源”版本。这让我克服了我遇到的几个错误:
请求的模块“blah”没有提供名为“default”的导出
和
无法设置未定义的属性“时刻”(在 moment.js:10)
这让我一直在加载它所依赖的其他模块,因为我猜它们的文件扩展名丢失了。
GET https://blah/lib/moment/src/lib/locale/locale net::ERR_ABORTED 404 (moment.js:37)
3 天后,我把头发扯掉了,我觉得我一直在打一场我根本不应该尝试的战斗。
我希望在 2021 年,在 ESM 浏览器广泛支持的情况下,这会起作用,但我尝试了 5 个不同的日期时间库,但都没有成功。
我认为 404 已经发生是因为作者不希望人们像这样使用他们的库,所以他们完全知道它不会在浏览器中加载,所以他们放弃了文件扩展名??
我是否应该在我的客户端构建过程中添加一个额外的步骤 Gulp,以便在即时源代码中重新添加扩展?
还是我做错了什么?
是不是每个人都使用“捆绑器”,而这些工具以某种方式修复了所有这些东西,因此 99% 的 Web 开发人员从未出现过这些问题??
提前致谢。
【问题讨论】:
-
您可以将代码分享为minimal reproducible example 吗?故事很有用,但例子更好。
-
这就是 esm 的问题。我用雪包。每个人都使用捆绑器,除非他们已经编写了 100% 的源代码。仅仅添加文件扩展名是行不通的。来自 node_modules 的所有导入都没有完整路径。