无法将 webpack 捆绑的 UMD 库作为 ES6 导入导入

Unable to import webpack-bundled UMD library as an ES6 import

提问人:StillFiles2 提问时间:2/22/2019 更新时间:9/20/2023 访问量:4254

问:

我使用 Webpack 编写了一个 javascript 库。入口点如下所示:someClass.js

import x from './x'
/* several more imports here */

class SomeClass {}

export default SomeClass;

捆绑此库的 webpack 配置如下:

module.exports = {
    entry: './someClass.js',
    output: {
        path: __dirname,
        filename: 'lib.js',
        library: 'lib',
        libraryTarget: 'umd',
    },

然后,我将生成的导入到一个简单中,定义如下:lib.jsindex.html

<!DOCTYPE html>
<html>
<head>
</head>

<body>
<script src="app.js" type="module"></script>
</body>
</html>

在 中,我只是尝试导入文件,如下所示:app.js

import  * as lib from './lib.js';

console.log(lib);

// Output: Module {Symbol(Symbol.toStringTag): "Module"}   Symbol(Symbol.toStringTag): "Module"

但是,此 import 语句似乎没有按计划工作(我希望模块的字段是我的构造函数)。defaultSomeClass

我可以访问库的默认导出的唯一方法是,如果我执行全局导入语句,如下所示,该语句设置为对象:SomeClassapp.jslibwindow

import './lib.js';
console.log(window.lib);

// Output: Module {default: ƒ, __esModule: true, Symbol(Symbol.toStringTag): "Module"} default: class SomeClass_SomeClass

我不希望我的类在全局可用,因为它很难模块化我的代码。window

我还希望能够在网络上的各种地方(react 应用程序、独立的 html 文件等)使用这个库,因此希望最大限度地减少依赖性。

我可以做些什么来将模块导入为 es6 导入?

JavaScript 节点.js Webpack ecmascript-6 模块

评论


答:

0赞 dr-js 1/21/2021 #1

ES6 导入仅适用于以下关键字:export

export { A }
export default B

Nodejs 的 commonjs2 模块在 Web 上不起作用,如下所示:

module.exports = { A, default: B }

Webpack 的输出也不会保留 ES6 关键字, 由于关键字语法不可策略填充,并且会在其他环境中中断。libraryTarget: "umd"export

因此,您可能希望像其他软件包一样发布 2 组文件(和),并使用 babel 或 rollup 来打包版本并保留 ES6 关键字。cjs/es/es/export

另请查看:使用 webpack 输出一个 ES 模块,它很好地解释了 Webpack 部分。

0赞 faebster 7/25/2023 #2

导出了一个默认类:

import SomeClass from './lib'因此应该工作吗?

否则,我们应该检查 webpack 包以了解发生了什么。我认为根本没有用例。* as

从 Node.js 13.2.0 开始支持 ECMAScript。所以我投票支持转译为 ES6 并升级 Node.js 如果是古老的。

由于 async & defer 建议再次放入 .<script><head>