【问题标题】:How to use npm packages as ES6 modules loaded by the browser in 2021?2021年如何使用npm包作为浏览器加载的ES6模块?
【发布时间】: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 的所有导入都没有完整路径。

标签: javascript es6-modules


【解决方案1】:

您希望导入捆绑版本的 lib 以便能够做到这一点。试试:

import from 'https://unpkg.com/moment@2.29.1/dist/moment.js' ;

您可以下载捆绑版本并添加到您的项目中。不要忘记也附上许可证,并检查它们是否至少是 MIT 或类似的。

如果您想参考源代码,您肯定需要构建它。特别是使用 typescript 的库。

【讨论】:

  • @luke-puplett 我对无捆绑程序的工作流程也有同样的渴望,发现 Skypack CDN 似乎运行良好,易于使用并且生成单个文件(仅指向另一个单一的全输入-one JS 文件)意味着下载以供离线使用也很容易,我的回答中有更多详细信息:stackoverflow.com/a/69443532/85472
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-26
  • 1970-01-01
  • 1970-01-01
  • 2015-07-31
  • 2017-02-23
  • 2018-10-24
  • 2020-06-04
相关资源
最近更新 更多