Rollup 不会连接 JavaScript 文件;它将一组 ES2015 模块转换为功能等效的单个脚本。 ES2015 模块的功能与大多数其他语言中的模块不太一样(当然不像 C/C++#include
s!), 我建议在这里阅读有关它们的内容。 http://exploringjs.com/es6/ch_modules.html如果您想导入常规 JavaScript 文件,则必须将其转换为 ES2015 模块,在紧要关头可以使用汇总插件 https://github.com/rollup/rollup/wiki/Plugins。例如,这是一个糟糕的通用解决方案,但您可以在 rollup.config.js 中添加类似的内容:
import replace from 'rollup-plugin-replace';
export default {
entry: './src/main.js',
dest: './dist/bundle.js',
plugins: [
replace({
include: './src/main.js',
values: {
'var Foo =': 'export default'
}
})
]
};
也许应该有一个插件可以自动导出东西,但似乎没有。
ES2015 模块不共享范围。因此,当你声明一个变量时Foo
在 foo.js 中,该变量在 bar.js 中不存在。当您尝试访问名为的变量时Foo
在 bar.js 中,它将它作为全局变量查找,就好像您没有在任何文件中声明它一样。通过重命名 foo.jsFoo
to Foo$1
,Rollup 通过阻止 foo.js 的本地行为来确保正确的行为Foo
以免影响全球Foo
.
为了在模块之间共享数据,您需要导出内容。这是重写示例的一种方法:
foo.js
export default (function () {
var someMethod = function () {};
return {
someMethod: someMethod
};
})();
bar.js
import module from './foo.js';
module.bar = "bar";
main.js
import "./bar.js"
但该代码不能很好地利用模块。你更有可能写这样的东西:
foo.js
export function someMethod () {}
bar.js
export { someMethod } from './foo.js';
export const bar = "bar";
main.js
import * as Bar from "./bar.js";
由于 Rollup 可以更多地推断通过导入和导出共享代码时如何使用代码,因此它可以做出更明智的决策,决定哪些代码必须保留,哪些可以在输出中丢弃,而不会影响功能。对于第二个示例,它根本不输出任何代码,这一事实证明了这一点。两者实际上都没有做任何事情,但 Rollup 无法确定第一个,因为它用数据做了复杂的事情,而不仅仅是使用导出。