Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Webpack 如何输出具有允许选择性导入的对等依赖关系的NPM包?_Webpack_Babeljs_Peer Dependencies - Fatal编程技术网

Webpack 如何输出具有允许选择性导入的对等依赖关系的NPM包?

Webpack 如何输出具有允许选择性导入的对等依赖关系的NPM包?,webpack,babeljs,peer-dependencies,Webpack,Babeljs,Peer Dependencies,我发布的模块使用了一些对等依赖项: ... "peerDependencies": { "react": ">=16", "react-dom": ">=16", "@material-ui/core": ">=4", "@material-ui/icons": ">=4" },

我发布的模块使用了一些对等依赖项:

...
"peerDependencies": {
  "react": ">=16",
  "react-dom": ">=16",
  "@material-ui/core": ">=4",
  "@material-ui/icons": ">=4"
},
...
在我的package.json文件中,我声明peerDependencies:

...
"peerDependencies": {
  "react": ">=16",
  "react-dom": ">=16",
  "@material-ui/core": ">=4",
  "@material-ui/icons": ">=4"
},
...
在我的webpack配置中,我声明了externals和输出格式
commonjs2
(我根本不知道为什么我会使用
commonjs2
,而不是
commonjs
):

这似乎是工作,因为我可以看到外部不包括在输出文件中。然而,在我的项目中包含这个包的输出会导致更大的包大小

我认为这是因为捆绑包的输出将我的
import
语句转换为
require
语句,因此在我使用此包的项目中,无法优化定义为
require
语句的对等依赖项

换句话说,包的输出不是将
@material ui/core
库作为构建的一部分,而是将其引用为
require(“@material ui/core”)

对吗

打包对等依赖项的正确方法是什么,以便:

  • 它们遵循commonjs模块格式(这是否必要)
  • 对等依赖项的间接导入仍然可以是选择性的
  • 我认为(但可能是错误的)目前发生的情况是:

    // In my project where I consume the package
    import { Thing } from '@org/package-name'
    
    // And in @org/package-name` source code, I have
    import { Card } from '@material-ui/core'
    
    // Which gets transpiled to (more or less)
    require('@material-ui/core').Card
    
    // Which means that when I use "Thing", that I'm loading the whole of @material-ui/core
    

    我还尝试过使用
    babel插件转换导入配置babel。但是我发现,接下来我必须为每次导入配置对等依赖项/外部(
    @material ui/core/Card
    @material ui/core/List
    ,等等)

    我发现,工作解决方案是在预设环境的babel配置中将targets.esmodules设置为true

    我认为这对我有效的原因是我在一个条目中重新导出模块。commonjs格式的命名导出在导入时不能很容易地隔离


    但这只是一个猜测。

    我发现,有效的解决方案是在预设环境的babel配置中将targets.esmodules设置为true

    我认为这对我有效的原因是我在一个条目中重新导出模块。commonjs格式的命名导出在导入时不能很容易地隔离


    但这只是一个猜测。

    目前最简单的解决方案似乎没有指定对等依赖项,因为我的工作流应该会导致重复数据消除导入…目前最简单的解决方案似乎没有指定对等依赖项,因为我的工作流应该会导致重复数据消除导入。。。