NodeJS 我是否应该在库包中包含节点模块?

kse8i1jr  于 2023-06-22  发布在  Node.js
关注(0)|答案(1)|浏览(173)

我正在开发一个React组件库。这个库被几个内部NextJs项目使用。
出于与NextJ兼容的原因,这个库需要在某个时候被翻译成CommonJ。
问题是我的一些库的npm依赖项不处理CommonJS。例如,swiper就是这种情况。
所以我有两个选择:

  • 要么我将npm依赖声明为peerDependencies,然后由我的库的每个消费者来正确地编译它们。这使得我的库的捆绑更轻,但它在每个项目中创建了许多配置约束(例如,对于NextJs和Jest)。
  • 或者我在bundle中包含了npm依赖项,在我看来这是一种反模式,但它允许我公开CJS和MJS:我的图书馆的消费者几乎无事可做。

我也可以设想两者的混合:我忽略了管理CommonJs和ES模块的所有依赖项,我只转置那些必要的依赖项。
你觉得呢?

y4ekin9u

y4ekin9u1#

我们也有同样的情况--我们有一个Next.js应用程序,它依赖于一个潜在的ESM模块的核心库。我建议不要捆绑你的依赖。您的下游应用程序可能具有相同的依赖项,现在您将最终加载它们两次。您可能已经在其他第三方依赖项(具有ESM依赖项)中遇到了这个问题。只需将它们添加到next.config.js中的transpilePackages列表中:https://nextjs.org/docs/app/api-reference/next-config-js/transpilePackages。我们还使用了next/jest,它似乎也可以选择配置,并且似乎可以工作。唯一的警告是,我发现我们必须转译@babel/runtime,但只有当jest运行时,否则它会炸毁主应用程序。

/** @type {import('next').NextConfig} */
const nextConfig = {
  transpilePackages: ['@acme/ui', 'lodash-es'],
}
 
module.exports = nextConfig

相关问题