不再为 Node.js 模块自动引入 Polyfills

在早期,webpack 的目的是为了让大多数的 Node.js 模块运行在浏览器中,但如今模块的格局已经发生了变化,现在许多模块主要是为前端而编写。webpack <= 4 的版本中提供了许多 Node.js 核心模块的 polyfills,一旦某个模块引用了任何一个核心模块(如 cypto 模块),webpack 就会自动引入这些 polyfills。

比如下面这个签名的函数使用到了 crypto 模块,因为在浏览器环境下是没有 crypto 这个东西的,所以要引入 polyfills 做兼容处理。

const crypto = require('crypto');


// 将值通过私钥签名,由.分割原值和签名
function sign (val, secret) {
  return val + '.' + crypto
    .createHmac('sha256', secret)
    .update(val)
    .digest('base64')
    .replace(/\=+$/, '');
};


module.exports = sign;

怎么防止打包的时候把 crypto 模块打进去了,其实我们可以在 package.json 里面配置 browser 字段,然后设置值 false 就可以。这样代码就只能在 node 环境下运行了。

{
  "name": "webpack4",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "browser": {
    "buffer": false
  },
  "scripts": {
    "webpck": "npx webpack"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "webpack": "^4.35.3",
    "webpack-cli": "^3.1.0"
  }
}

从 webpack 5 开始不再自动填充这些 polyfills,而会专注于前端模块兼容。node 的模块也不属于前端模块,所以之后不会为 Node.js 模块引入 polyfills 做兼容了。

尽量使用前端兼容的模块。比如 axios 这样的库,即可以在浏览器中运行,也可以在 node 环境中运行。

可以手动为 Node.js 核心模块添加 polyfill。错误提示会告诉你如何实现。

Package 作者:在 package.json 中添加 browser 字段,使用 package 与前端兼容。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将 C++ 代码导出为 Node.js 模块,可以使用 Node.js 的 C++ Addons API。以下是简单的步骤: 1. 创建一个 C++ 文件,编写 C++ 代码。 2. 在 C++ 文件中包含 node.h 头文件,该文件包含 Node.js 的 C++ Addons API。 3. 编写和导出 Node.js 模块的函数。可以使用 NODE_MODULE 宏将其导出为 Node.js 模块。 例如,以下是将 C++ 函数 add 导出为 Node.js 模块的示例代码: ```c++ #include <node.h> namespace demo { using v8::FunctionCallbackInfo; using v8::Isolate; using v8::Local; using v8::Object; using v8::String; using v8::Value; void Add(const FunctionCallbackInfo<Value>& args) { Isolate* isolate = args.GetIsolate(); // 检查参数个数 if (args.Length() < 2) { isolate->ThrowException( Exception::TypeError( String::NewFromUtf8(isolate, "Wrong number of arguments"))); return; } // 检查参数类型 if (!args[0]->IsNumber() || !args[1]->IsNumber()) { isolate->ThrowException( Exception::TypeError( String::NewFromUtf8(isolate, "Wrong arguments"))); return; } // 计算结果 double value = args[0]->NumberValue(isolate) + args[1]->NumberValue(isolate); Local<Number> num = Number::New(isolate, value); // 返回结果 args.GetReturnValue().Set(num); } void Initialize(Local<Object> exports) { NODE_SET_METHOD(exports, "add", Add); } NODE_MODULE(NODE_GYP_MODULE_NAME, Initialize) } // namespace demo ``` 在上面的示例中,我们使用 NODE_MODULE 宏将 Initialize 函数导出为 Node.js 模块。其中,NODE_GYP_MODULE_NAME 是 Node.js 模块的名称,可以在 binding.gyp 中配置。 最后,使用以下命令将 C++ 代码编译为 Node.js 模块(假设 C++ 文件名为 addon.cc): ``` node-gyp configure build ``` 编译成功后,将生成一个名为 build/Release/addon.node 的文件,即为 Node.js 模块。在 Node.js 中使用 require 函数加载该模块即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值