如何在 Babel 中使用 BigInt 取幂?

Leo*_*ang 5 javascript babeljs

考虑一下:

const a = BigInt(2);
const b = BigInt(2);
const c = a ** b;
Run Code Online (Sandbox Code Playgroud)

Babel 会将其转换为:

var a = BigInt(2);
var b = BigInt(2);
var c = Math.pow(a, b);
Run Code Online (Sandbox Code Playgroud)

但是,Math.pow不适用于BigInt. 据我所知,让 Babel 忽略某行是不可能的。我找到了babel-plugin-transform-bigint,但我不想为此加载 polyfill。如果BigInt不支持,那么我将只为输入设置一个上限。

我的选择是覆盖Math.pow或手动实现幂运算。目前是否无法将本地**运算符与BigIntBabel 一起使用?

另外,只是确认一下,**如果不支持它会是一个语法错误吗?

编辑:babel.config.js:

module.exports = {
  presets: [
    ['@babel/preset-env', {
      useBuiltIns: 'usage',
      corejs: '2',
      exclude: [
        'babel-plugin-transform-async-to-generator',
        'babel-plugin-transform-regenerator',
      ],
    }],
  ],
  plugins: [
    '@babel/plugin-syntax-dynamic-import',
    ['@babel/plugin-transform-react-jsx', { pragma: 'h' }],
    '@babel/plugin-proposal-do-expressions',
    '@babel/plugin-proposal-class-properties',
    '@babel/plugin-proposal-optional-chaining',
    /*
    Async/await increases file size by a lot.
    ['module:fast-async', {
      'compiler': { 'promises': true, 'generators': false, 'useRuntimeModule': true },
    }],
    ['@babel/plugin-transform-modules-commonjs', {
      'strictMode': false,
    }],
    */
  ],
  env: {
    production: {
      plugins: ['transform-react-remove-prop-types'],
    },
  },
  sourceType: 'unambiguous',
};
Run Code Online (Sandbox Code Playgroud)

rag*_*fin 0

对于那些在Create React App中遇到此问题的人。请参阅以下主题和解决方案:

https://github.com/0xs34n/starknet.js/issues/37#issuecomment-955797303https://github.com/babel/babel/issues/13109#issuecomment-826287089

基本上你可以改变browserlist你的package.json以防止 babel 运行它的transform-exponentiation-operator插件,如下所示:

"browserslist": {
    "production": [
      "chrome >= 67",
      "edge >= 79",
      "firefox >= 68",
      "opera >= 54",
      "safari >= 14"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  }
Run Code Online (Sandbox Code Playgroud)

对于非浏览器反应环境,例如react-native-macosreact-native-windowselectron,请参阅此处的要点,了解创建自己的环境以babel.config.js选择要运行的插件/转换的方法:

https://gist.github.com/karanjthakkar/3241808022a75d8068f35a33b57e90c5

有一个推特线程解释了这个问题: https://twitter.com/geekykaran/status/1082218546799755266

babel.config.js没有应用的示例babel-plugin-transform-exponentiation-operator

const lazyImports = require('metro-react-native-babel-preset/src/configs/lazy-imports');

module.exports = (api) => {
  api.cache(true);
  return {
    comments: false,
    compact: true,
    plugins: [
      '@babel/plugin-transform-flow-strip-types',
      '@babel/plugin-proposal-optional-catch-binding',
      // SUPPORTED BY DEFAULT: '@babel/plugin-transform-block-scoping',
      ['@babel/plugin-proposal-class-properties', {
        loose: true,
      }],
      '@babel/plugin-syntax-dynamic-import',
      '@babel/plugin-syntax-export-default-from',
      // SUPPORTED BY DEFAULT: '@babel/plugin-transform-computed-properties',
      // SUPPORTED BY DEFAULT: '@babel/plugin-transform-destructuring',
      // SUPPORTED BY DEFAULT: '@babel/plugin-transform-function-name',
      // SUPPORTED BY DEFAULT: '@babel/plugin-transform-literals',
      // SUPPORTED BY DEFAULT: '@babel/plugin-transform-parameters',
      // SUPPORTED BY DEFAULT: '@babel/plugin-transform-shorthand-properties',
      '@babel/plugin-transform-react-jsx',
      // SUPPORTED BY DEFAULT: '@babel/plugin-transform-regenerator',
      '@babel/plugin-transform-sticky-regex',
      '@babel/plugin-transform-unicode-regex',
      '@babel/plugin-proposal-export-default-from',
      [
        '@babel/plugin-transform-modules-commonjs',
        {
          strict: false,
          strictMode: false, // prevent "use strict" injections
          lazy: importSpecifier => lazyImports.has(importSpecifier),
          allowTopLevelThis: true, // dont rewrite global `this` -> `undefined`
        },
      ],
      // SUPPORTED BY DEFAULT: '@babel/plugin-transform-classes',
      // SUPPORTED BY DEFAULT: '@babel/plugin-transform-arrow-functions'
      // SUPPORTED BY DEFAULT: '@babel/plugin-transform-spread',
      '@babel/plugin-proposal-object-rest-spread',
      // SUPPORTED BY DEFAULT: [
      // SUPPORTED BY DEFAULT:   '@babel/plugin-transform-template-literals',
      // SUPPORTED BY DEFAULT:   {loose: true}, // dont 'a'.concat('b'), just use 'a'+'b'
      // SUPPORTED BY DEFAULT: ],
      // SUPPORTED BY DEFAULT: '@babel/plugin-transform-exponentiation-operator',
      // SUPPORTED BY DEFAULT: '@babel/plugin-transform-object-assign',
      // SUPPORTED BY DEFAULT: ['@babel/plugin-transform-for-of', {loose: true}],
      // 'metro-react-native-babel-preset/src/transforms/transform-symbol-member',
      '@babel/plugin-transform-react-display-name',
      '@babel/plugin-proposal-optional-chaining',
      '@babel/plugin-proposal-nullish-coalescing-operator',
      ['@babel/plugin-transform-runtime', {
        helpers: true,
        regenerator: true,
      }],
    ],
  };
};
Run Code Online (Sandbox Code Playgroud)

使用 npm/yarn 重新启动捆绑器时请记住重置缓存

npm start -- --reset-cache
Run Code Online (Sandbox Code Playgroud)