javascript - 使用 polyfill 覆盖一些 Webpack 5 NodeJS 模块
问题描述
我有 NodeJS 代码,现在需要迁移到嵌入式系统。简单地启动 NodeJS(BeagleBone Black 上的“Hello World”~11 秒)需要很长时间,所以我们需要一个替代方案。IoT.js 看起来很有希望,但它不支持我的代码需要的一些内部 NodeJS 模块(例如 url、zlib、tty)。我正在使用 Webpack 5.35.0 为我的代码创建一个文件,但这就是我的问题所在。我想将 Webpack 与node
目标一起使用,因为 IoT.js 提供了节点本机提供的大部分内容。但是有没有办法强制 Webpack 对某些模块使用 polyfill?例如,browserify-zlib
而不是期望节点zlib
。
我的基本 Webpack 配置很简单:
{ target: 'node10.17',
entry: './index.js',
output:
{ filename: 'index.js',
path: '/work/proj/dist',
libraryTarget: 'umd' },
stats: 'errors-only',
resolve:
{ modules: [ '/work/proj/node_modules' ],
extensions: [ '.js', '.json' ],
}
}
我做了一些阅读,人们声称添加了一个简单的resolve.fallback.zlib = false
并且resolve.alias
应该做的伎俩——这对我不起作用。
我试图简单地添加resolve.fallback.zlib = false
,希望从 Webpacked 输出中省略 zlib,但这没有用。无论我做什么,标准的 Webpack 样板“节点”zlib 包含代码都存在。
node
使用目标时的标准 Webpack 样板。
/***/ "zlib":
/*!***********************!*\
!*** external "zlib" ***!
\***********************/
/***/ ((module) => {
"use strict";
module.exports = require("zlib");;
/***/ })
我尝试过的其他事情是——所有这些都不起作用:
我希望这会给 zlib 起别名并实际放入browserify-zlib
代码中。
resolve:
{ modules: [ '/work/proj/node_modules' ],
extensions: [ '.js', '.json' ],
alias: { zlib: '/work/proj/node_modules/browserify-zlib/lib/index.js' },
fallback: {} } }
与前面的示例相同,但认为通过禁用回退,别名/polyfill 将进入输出。这就是其他人在网上取得成功的原因。
resolve:
{ modules: [ '/work/proj/node_modules' ],
extensions: [ '.js', '.json' ],
alias: { zlib: '/work/proj/node_modules/browserify-zlib/lib/index.js' },
fallback: { zlib: false } } }
在这里我只是希望不包含 zlib 以查看 Webpack 是否会在node
目标中省略它。
resolve:
{ modules: [ '/work/proj/node_modules' ],
extensions: [ '.js', '.json' ],
fallback: { zlib: false } } }
最后,我尝试使用该插件node-polyfill-webpack-plugin
,但使用node
目标它似乎没有做任何事情。如果我选择了一个web
目标,插件似乎可以按我的预期工作(取自这里)。同样,我更喜欢一个node
目标,这样它就可以使用本机模块并且设置看起来更干净;但也许这是唯一的方法。如果这是方法,那么如何支持fs
IoT.js 原生支持的其他非浏览器模块?
...
plugins = [ new NodePolyfillPlugin({ excludeAliases: [] }) ];
It seems that when the node
target is selected there is no way to override any of the default/boilerplate code added to the output file. 有没有人有使用 IoT.js 和 Webpack 的经验,或者覆盖默认的 Webpack 5 代码node
并改用 polyfill?不确定 Webpack 插件是否是一种方法。我对 Webpack 有点陌生。这可能是 Webpack 的问题吗?任何帮助,将不胜感激。
解决方案
推荐阅读
- java - Windows 10 上的 gradle 测试:无法读取文件内容:executionHistory.lock
- python - 文本处理和 pd.get_dummies() 编码消耗大量 RAM
- c++ - 使用 cv::fisheye::undistortImage 去扭曲鱼眼图像
- python - 通过python连接公司内部SMTP服务器时使用共享邮箱
- r - Tibble 和粘贴功能
- python - 比较具有多个索引的两个列表
- algorithm - 具有分配的恒定时间复杂度
- javascript - 如何在存在时使用数组值构建消息字符串
- javascript - 如何发布我的 vue npm 库以同时支持 Vue 2 和 Vue 3,
- java - 对我的括号的改进,重新对齐 Java 代码