你好!
感谢您提供的这个很棒的图书馆!
但是,我认为程序包清单( package.json
文件)中的"module"
字段应指向ESM软件包,例如./src/moment.js
。
支持 ESM 的捆绑器(Webpack、Rollup 等)应该能够使用module
字段找到 ESM 捆绑包,以便使用现代优化技术(如摇树)。 现在,改为使用./moment.js
UMD 包。
这会导致整个库加载到启用 ESM 的项目中,即使您从中导入单个符号也是如此。
例如,这样的导入:
import { isMoment } from 'moment';
将从库中导入所有内容,但是,只请求了一个函数。
而且您不能在TypeScript项目中使用import { isMoment } from 'moment/src/moment';
作为解决方法,因为它将破坏输入。
看完./src/moment.js
的内容后,我在说我的话。 从 ESM 的角度来看,内容没有任何意义。 无需导入和重新导出Moment
, isMoment
等有用的符号,而是构造一个对象并将其导出。 我相信这是UMD捆绑包的切入点,不是吗?
为了使现代工具能够正常工作,我们需要一个适当的ESM捆绑包,该捆绑包将分别导出所有有用的符号。
我已经设法通过以下方式导入所需的符号(无需加载整个捆绑的moment.js):
// @ts-ignore
import { isMoment, Moment } from 'moment/src/lib/moment/constructor';
但是我不得不使用@ts-ignore
来抑制键入错误,该错误允许导入,但破坏了导入符号的所有键入。 另外,该路径很丑陋,最终用户不应该使用该路径(因为这会破坏封装)。
我刚刚做了一个实验。 我在包的根目录下创建了一个名为moment.esm.js
的文件,内容如下:
export { isMoment, Moment } from './src/lib/moment/constructor';
并添加了一个module
字段以从软件包清单中指向它。
然后,将其导入到我的应用程序中:
import { isMoment, Moment } from 'moment';
它可以正确地输入,并且键入声明可以按预期工作,并且在Webpack和汇总构建期间也可以正常工作。 仅导入指定的符号,而不会加载包含所有语言环境的整个捆绑软件。
我相信这是一种方法,可以扩展以导出声明中描述的其他符号。
我支持这个。
参见https://momentjs.com/docs/#/ -project-status /
最有用的评论
看完
./src/moment.js
的内容后,我在说我的话。 从 ESM 的角度来看,内容没有任何意义。 无需导入和重新导出Moment
,isMoment
等有用的符号,而是构造一个对象并将其导出。 我相信这是UMD捆绑包的切入点,不是吗?为了使现代工具能够正常工作,我们需要一个适当的ESM捆绑包,该捆绑包将分别导出所有有用的符号。
我已经设法通过以下方式导入所需的符号(无需加载整个捆绑的moment.js):
但是我不得不使用
@ts-ignore
来抑制键入错误,该错误允许导入,但破坏了导入符号的所有键入。 另外,该路径很丑陋,最终用户不应该使用该路径(因为这会破坏封装)。我刚刚做了一个实验。 我在包的根目录下创建了一个名为
moment.esm.js
的文件,内容如下:并添加了一个
module
字段以从软件包清单中指向它。然后,将其导入到我的应用程序中:
它可以正确地输入,并且键入声明可以按预期工作,并且在Webpack和汇总构建期间也可以正常工作。 仅导入指定的符号,而不会加载包含所有语言环境的整个捆绑软件。
我相信这是一种方法,可以扩展以导出声明中描述的其他符号。