node.js - Webpack 外部和用户范围的包
问题描述
首先,我想承认这是我第一次深入研究 webpack,我可能会遗漏一些明显的东西。
我正在开发一个node JS
脚本,它作为一种代理运行,为我的目标环境中的 HTML5/JS 客户端应用程序提供功能和数据。部分 API 在运行时在目标环境的 node_modules 中提供,而不是在构建时提供。在我的代码中,我提供了const phoenix = require('@phoenix/apis/dist/index');
运行 webpack,一切都很好,但是当我尝试运行脚本时,我遇到了:
Object.@phoenix/apis/dist/index (/home/path/node_modules/AgendaWeb_0.0.1/main.js:2312:1) 处的令牌无效或意外
这是有道理的,因为 webpack 正在把 require 变成这样:
eval("module.exports = @phoenix/apis/dist/index;\n\n//# sourceURL=webpack:///external_%22@phoenix/apis/dist/index%22?");
并且@phoenix
不是可以使用的有效模块/对象名称。
我基本上需要 webpack 只保留 require (我不知道这在捆绑的上下文中是否有意义),因此节点实例可以在其运行的环境中引入模块。
这是我的 webpack 配置:
module.exports = {
entry: {
main: './src/agendaAgent'
},
output: {
path: path.resolve(__dirname, './prod/')
},
externals: /@phoenix/,
target: 'node',
plugins: [
new CleanWebpackPlugin(),
new CopyPlugin([{from:'./manifest.json', to:'./'}]),
new webpack.DefinePlugin({ 'global.GENTLY': false })
]
};
我希望有一种方法可以包含一个在运行时引用的外部模块(在node_modules/@phoenix
目录中 - 这是它当前的工作方式,在 webpacked 代码之外)
到目前为止,我已经尝试使用 externals(如上所述),并尝试使用 resolve.alias 为其提供通往库的直接路径(这不是一个好的解决方案,因为模块不是开发环境的一部分 - 我没有t 得到这个工作要么)。我也尝试使用 IgnorePlugin,但如果我理解正确,它只会阻止生成匹配的模块。
任何帮助或指导表示赞赏。
解决方案
在为此苦苦挣扎了一段时间后,我偶然发现了答案。它没有明确说明,但以下配置更改允许 webpack 正确捆绑所有内容:
output: {
path: path.resolve(__dirname, './prod/'),
libraryTarget: 'umd'
}
相关的更改是libraryTarget: 'umd'
,这使得 webpack 将你的模块捆绑在 commonJS、AMD 和 Global 中。这里的关键点是 webpack 并没有尝试将模块公开为对象的属性。可能还有其他libraryTarget
值会导致成功输出,但目前这对我有用。
推荐阅读
- visual-c++ - 为什么 xmm11 在优化代码中不保留交叉调用?
- ios - Swift:使用present时无法在视图控制器之间传递数据
- python - 如何使用 Jenkins 中分离的变量、关键字和测试文件构建 Robot Framework 项目
- r - 使用 rollapply 计算每周百分比变化
- identityserver4 - 解密 Identity Server 中的共享密钥
- javascript - 为什么控制台显示 js 代码,即使我没有在单独的文件中?
- java - 使用 Spring Boot 和 Thymeleaf 上传多个文件
- css - React native:试图在滚动时隐藏搜索栏
- javascript - 如果目标平台是 Raspberry Pi OS (arm),则禁用代码行 (JavaScript/QML)
- angular - 带有 AAD 的 Azure Function Cors