javascript - Webpack + @babel/preset-env 与动态导入... package.module 不被尊重?

标签 javascript webpack babeljs

我不知道这是预期的行为还是我的配置有问题。据我所知:

使用此配置:

{
  "presets": [
    "@babel/preset-typescript",
    ["@babel/preset-env", {
      "corejs": 3,
      "useBuiltIns": "usage",
      "bugfixes": true
    }]
  ],
  "plugins": [
    ["@babel/plugin-transform-typescript", {
      "allowDeclareFields": true
    }],
    "@babel/plugin-proposal-class-properties"
  ]
}

当我动态导入任何库时,会导入错误的文件。例如,对于 vanilla-lazyload 库,在 package.json 中定义以下内容:

{
  "name": "vanilla-lazyload",
  "main": "dist/lazyload.min.js",
  "module": "dist/lazyload.esm.js"
}

导入方式:

import('vanilla-lazyload').then(({ default: LazyLoad }) => { /* use */ });

.... dist/lazyload.min.js 将被捆绑,而不是 dist/lazyload.esm.js

有什么线索吗?

最佳答案

Babel 不会干扰你的动态导入。这里 Webpack 决定如何解析您导入的模块。

它具有默认的字段顺序,具体取决于您的 webpack 配置目标字段。 (参见https://webpack.js.org/configuration/resolve/#resolvemainfields) 默认顺序是 'browser''module' 然后 'main' 并且在您的示例中 vanilla-lazyload 还具有“browser”属性在他们的 package.json ( https://github.com/verlok/vanilla-lazyload/blob/master/package.json#L7 )

{
  "main": "dist/lazyload.min.js",
  "module": "dist/lazyload.esm.js",
  "browser": "dist/lazyload.min.js",
}

您可以通过以下方式覆盖 webpack 的默认顺序

// webpack config
module.exports = {
  //...
  resolve: {
    mainFields: ['module', 'browser', 'main'],
  },
};

如果您不想更改也将应用于其他导入的顺序,则可以使用完整路径: import("vanilla-lazyload/dist/lazyload.esm.min.js") 或者您在 webpack 配置中为其指定别名:

const { resolve } = require("path");
module.exports = {
  resolve: {
    alias: {
      "vanilla-lazyload": resolve("node_modules/vanilla-lazyload/dist/lazyload.esm.min.js"),
    },
  },
}

但是,如果 vanilla-lazyload 的作者决定为浏览器环境使用 .min.js,那么也许您应该向他们咨询 esm 包是否也很好用。例如,它似乎没有被缩小(我已经为此打开了一个 PR)。并且它没有被转译。您必须确保它适用于您的设置/运行环境。

关于javascript - Webpack + @babel/preset-env 与动态导入... package.module 不被尊重?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73164680/

相关文章:

javascript - 为什么这个 JavaScript 映射不是无限循环?

javascript - 不同的背景图片jquery mobile

javascript - Vue cli 3 显示来自 package.json 的信息

javascript - 奥里利亚网页包 : how to load images

javascript - 如何使用 Selenium IDE 测试损坏的图像?

javascript - 如何将链接变量连接到javascript?

reactjs - Webpack React 构建不适用于生产环境

javascript - 如何浏览、编译 ES6 和缩小 NodeJS 应用程序

reactjs - 如何升级到 Babel 7

javascript - 使用 babel 解析器时,Eslint 禁用严格模式