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 等都是使用了前缀,达成了不污染全局的功能
