汇总包括不需要的依赖项和缺少输出中的函数

Rollup including unneeded dependancies and missing a function in output

我是第一次使用 rollup,它产生了一些意想不到的结果。下面是示例中的三个文件以及 rollup 的输出和我正在寻找的输出类型。

Here's a repo with my complete example.

我有三个文件 01.js02.js03.js

01.js

import { fakePromise } from './02'

export default fakePromise

02.js

import { map } from 'lodash'
import { stupidReference } from './03'

export function fakePromise (str) {
  return stupidReference(str)
}

export function fakeMap (arr) {
  return map(arr, item => item + ' is stupid')
}

03.js

import Promise from 'bluebird'

export function stupidReference (str) {
  return Promise.resolve(str)
}

这就是 rollup 正在 return 的内容。 (实际)

import { map } from 'lodash';
import Promise from 'bluebird';

function fakePromise (str) {
  return stupidReference(str)
}

export default fakePromise;

这是我希望汇总到 return 的结果。 (预期)

import Promise from 'bluebird';

function stupidReference (str) {
  return Promise.resolve(str)
}

function fakePromise (str) {
  return stupidReference(str)
}

export default fakePromise;

我的印象是汇总会摆脱项目中不需要的所有依赖项。但是您可以看到 actual 输出还包含不需要的依赖项 lodash,并且还缺少另一个内部函数 stupidReference.

我很好奇为什么它没有像我预期的那样工作。我也很好奇我是否正确使用 rollup 工具。如果这不是预期用途,我真的很想找到一种工具来实现我正在寻找的功能。我想提供一个函数(或上面 01.js 之类的文件)并且只有 运行 该函数所需的代码。

更新 1

不确定我的代码发生了什么,但是汇总站点上的编辑器能够拉入另一个文件并沿着树向下移动。 Here's a link to exactly what I have.

更新 2

我意识到我可能没有正确配置 babel,我安装了下面的两个模块并添加了 .babelrcrollup.config.js

npm i rollup-plugin-babel babel-preset-es2015-rollup --save

rollup.config.js

import babel from 'rollup-plugin-babel';

export default {
  entry: './01.js',
  plugins: [ babel() ],
  format: 'es6'
};

.babelrc

{
  "presets": [ "es2015-rollup" ]
}

使用此更新仍会生成相同的输出。

你会踢自己的:-) 回购有错字 – stupidReference 在几个地方拼写为 stuidReference。修复这些问题,它会很好地捆绑。 (如果 Rollup 看到一个它不知道来源的标识符,它会假定它是全局的而不是打字错误。)

即使不包含其依赖函数,Lodash 也会包含在内,因为 Rollup 无法知道 Lodash 是否有副作用。一种选择是将 Lodash 包含在捆绑包中(即使用 rollup-plugin-node-resolve) so that Rollup can see the code, but be aware that tree-shaking Lodash is easier said than done,因此建议使用 lodash-es 并导入单个文件:

import map from 'lodash-es/map.js';