首页 > 解决方案 > 使用 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目标,这样它就可以使用本机模块并且设置看起来更干净;但也许这是唯一的方法。如果这是方法,那么如何支持fsIoT.js 原生支持的其他非浏览器模块?

...
plugins = [ new NodePolyfillPlugin({ excludeAliases: [] }) ];

It seems that when the nodetarget 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 的问题吗?任何帮助,将不胜感激。

标签: javascriptnode.jswebpackwebpack-5

解决方案


推荐阅读