babel-polyfill做兼容的方式是
window.Promise = …
这个做法会污染全局环境
- 如果是一个独立的系统,无碍
- 如果是一个第三方的库,则全局污染是万万不可以的
如果 定义的不是Promise而是Promise1这样的变量,就不会造成全局污染了。
使用babel-runtime
需要安装新的插件 @babel/plugin-transform-runtime 和 @babel/runtime
{
"name": "babel",
"version": "1.0.0",
"main": "index.js",
"license": "MIT",
"devDependencies": {
"@babel/cli": "^7.12.1",
"@babel/core": "^7.12.3",
"@babel/plugin-transform-runtime": "^7.12.1",
"@babel/preset-env": "^7.12.1"
},
"dependencies": {
"@babel/polyfill": "^7.12.1",
"@babel/runtime": "^7.12.1"
}
}
修改babelrc文件
{
"presets": [
[
"@babel/preset-env",
{
"useBuiltIns": "usage",
"corejs": 3
}
]
],
"plugins": [
[
// 新增babel plugin-transformform-runtime插件
"@babel/plugin-transform-runtime",
{
"absoluteRuntime": false,
"corejs": 3,
"helpers": true,
"regenerator": true,
"useESModules": false
}
]
]
}
npx babel idnex.js
# 以下是结果
"use strict";
var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
require("core-js/modules/es.object.to-string");
require("core-js/modules/es.promise");
var _includes = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/includes"));
var _promise = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/promise"));
var _context;
var sum = function sum(a, b) {
return a + b;
};
_promise["default"].resolve(100).then(function (data) {
return data;
});
(0, _includes["default"])(_context = [10, 20, 30]).call(_context, 20);
可见 includes _promise 等都是使用了前缀,达成了不污染全局的功能