Webpack 库构建 returns 导入时未定义
Webpack library build returns undefined when imported
只是分享一个我花了几个小时调试的问题和解决方案:
我有一个代码库,我想用 webpack 将其构建为一个库,并将其包含在另一个项目中。但是,当我在其他库中导入输出文件时,它 returns undefined
.
这是(简化的)webpack 配置:
{
entry: './index.js',
mode: 'development',
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'app/my-app.[name].js'
library: 'my-app',
libraryTarget: 'umd'
},
optimization: {
runtimeChunk: 'single',
splitChunks: {
chunks: 'all',
cacheGroups: {
vendors: {
name: 'vendors',
test: /[\/](node_modules|libraries)[\/]/
}
}
},
minimizer: [new TerserPlugin({
cache: true,
sourceMap: true,
parallel: true,
exclude: [/my-app.vendors.js/]
})]
},
}
从其他项目,我将按如下方式导入库:
const lib = require('./lib/my-app/dist/my-app.main');
console.log(lib);
如果页面上没有任何错误,控制台只会显示 undefined
。
原来解决方案很简单:因为我使用的是 splitChunks
,输出包含 3 个文件:my-app.runtime.js
、my-app.vendors.js
和 my-app.main.js
。我假设每个块都会自动 require
其必要的依赖关系,但我假设错了。为了让图书馆工作,我需要像这样导入:
require('./lib/my-app/dist/my-app.runtime');
require('./lib/my-app/dist/my-app.vendors');
const lib = require('./lib/my-app/dist/my-app.main');
console.log(lib);
另一个很重要,因为 main
需要 vendors
和 runtime
。
如果你仔细想想,这很明显,但也许这会对碰巧错过它的其他人有所帮助。控制台中缺少错误对调试没有帮助。
只是分享一个我花了几个小时调试的问题和解决方案:
我有一个代码库,我想用 webpack 将其构建为一个库,并将其包含在另一个项目中。但是,当我在其他库中导入输出文件时,它 returns undefined
.
这是(简化的)webpack 配置:
{
entry: './index.js',
mode: 'development',
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'app/my-app.[name].js'
library: 'my-app',
libraryTarget: 'umd'
},
optimization: {
runtimeChunk: 'single',
splitChunks: {
chunks: 'all',
cacheGroups: {
vendors: {
name: 'vendors',
test: /[\/](node_modules|libraries)[\/]/
}
}
},
minimizer: [new TerserPlugin({
cache: true,
sourceMap: true,
parallel: true,
exclude: [/my-app.vendors.js/]
})]
},
}
从其他项目,我将按如下方式导入库:
const lib = require('./lib/my-app/dist/my-app.main');
console.log(lib);
如果页面上没有任何错误,控制台只会显示 undefined
。
原来解决方案很简单:因为我使用的是 splitChunks
,输出包含 3 个文件:my-app.runtime.js
、my-app.vendors.js
和 my-app.main.js
。我假设每个块都会自动 require
其必要的依赖关系,但我假设错了。为了让图书馆工作,我需要像这样导入:
require('./lib/my-app/dist/my-app.runtime');
require('./lib/my-app/dist/my-app.vendors');
const lib = require('./lib/my-app/dist/my-app.main');
console.log(lib);
另一个很重要,因为 main
需要 vendors
和 runtime
。
如果你仔细想想,这很明显,但也许这会对碰巧错过它的其他人有所帮助。控制台中缺少错误对调试没有帮助。