rollup打包,如何处理 Symbol.toPrimitive ?

通过rollup打包test.js,打包后文件中出现Symbol关键字
源文件:test.js

class A{}
export default A;

打包后文件:test.min.js

var A = function () {
    "use strict";
    ...其他代码--
     var e = r[Symbol.toPrimitive];
    ...其他代码--
}

rollup配置文件:rollup.config.js

import resolve from "@rollup/plugin-node-resolve";
import commonjs from "@rollup/plugin-commonjs";
import babel from "@rollup/plugin-babel";
import json from "@rollup/plugin-json";
import {terser} from "rollup-plugin-terser";

export default {
    input: ["./src/test.js"],
    output: {
        file: "./out/test.min.js",
        format: "iife",
        name: "A",
    },
    plugins: [resolve(), commonjs(), babel(), json(), terser()],
};

期望能够不生成Symbol.toPrimitive或者生成Symbol的polyfill。能在不支持ES6环境正常运行

阅读 1k
avatarAI BotBETA

在Rollup打包过程中,Symbol.toPrimitive 是一个内建的JavaScript方法,用于将一个对象转换为一个原始值。这个方法在ES6中引入,如果你在代码中直接使用了这个方法,那么Rollup在打包过程中就会保留它。

要处理这个问题,你可以在你的代码中或者在Rollup配置中添加一个polyfill,以便在不支持ES6的环境中运行。

一种可能的解决方案是在你的代码中添加一个polyfill:

if (!Symbol.toPrimitive) {
    Object.defineProperty(Symbol, 'toPrimitive', {
        value: function (obj) {
            return obj.valueOf();
        },
        writable: true,
        enumerable: false,
        configurable: true
    });
}

另一种解决方案是在Rollup配置中添加一个polyfill:

import "core-js/features/symbol-to-primitive";

这样,Rollup在打包过程中就会包含这个polyfill,以便在不支持ES6的环境中运行。

请注意,这种方法只适用于那些在打包后的代码中直接使用了Symbol.toPrimitive的情况。如果你的代码中没有直接使用这个方法,那么你可能需要检查你的依赖项,看看是否有其他库或插件在使用它。如果有,你可能需要更新这些库或插件,或者寻找替代方案。

1 个回答

首先,Symbol 是 Es6 引入的类型,如果不加 polyfill,那么在不支持 Es6 的环境下,不能正常运行。

如果不想打包为 Es5 的版本,可以检查 babel 的相关配置。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进