如何在rollupjs中禁用树摇?

8

我正在尝试使用RollUp.js将几个javascript文件打包在一起,但是当我这样做时,未使用的类会被删除。这个过程被称为tree shaking,我想禁用它。

我已经找到了这个,但是似乎没有任何效果。

// rollup.config.js

let configuration = {
  output: {
    format: 'es',
  },
  name: 'namename',
  input: './main.js',
  treeshake: false, // <-- disabling tree shaking?
};

export default configuration;

我在配置中添加了treeshake: false,但似乎没有任何效果。应该把它放在其他地方吗?
这是我正在尝试整合的文件。
// Base.js
export default class Base {
  aMethod() {
    return "Hello";
  }
}

// main.js 
import Base from './Base.js';

使用这个设置,我调用rollup --config,但它生成了一个空的结果。显然,树摇动正在发生,它正在删除Base类,尽管我已经导入它。

到目前为止,我找到的唯一解决方法是实际创建该类的一个实例,这是不可取的。

// main.js
import Base from './Base.js';

export default function () {
    {   
        new Base();
    }
}

我的目标是使用JSContext捆绑的javascript文件。它将把javascript作为字符串输入,然后从那里调用所需的方法。

// suppose rollup.js produces a file called "product.js"

let s = String(contentsOfFile: "path/to/product.js")
let context = JSContext()!
context.evaluateScript(s)

context.evaluateScript("var b = new Base()")
context.evaluateScript("b.aMethod()")

但由于树摇,基类从未放置在product.js中。

有没有一种方法可以禁用树摇?

我为此包含了一个示例项目

1个回答

8

您的入口文件 main.js 需要导出任何需要对外使用的类或其他值:

// main.js
import Base from './Base.js';
import SubB from './SubB.js';
import SubA from './SubA.js';

export { Base, SubA, SubB };

1
哇!rollup.js的创作者回复了!这真是太有帮助了! - DerrickHo328
当我使用您的建议时,它会生成一个JavaScript文件,其中包含在导出中指定的所有类,以及export {Base, SubA, SubB}。然而,看起来JavaScriptCore不支持关键字“export”。因此,我的解决方法是使用内置的cjs格式export default function(){Base, SubA, SubB},它不使用“export”作为关键字。 - DerrickHo328
1
我有一个包含数百个深度文件的项目。我需要所有具有特定名称模式的文件不被 tree shaking。这种解决方案仅适用于小型代码库,但对于我来说,手动添加大量导出到入口文件是不可维护的。 - vsync

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接