Rollup.js 如何在不做任何更改的情况下导入 js 文件(不是 es6 模块) (myvar$extrastring)
Rollup.js how import a js file (not es6 module) without any change (myvar$extrastring)
首先,我明白为什么 rollup.js 需要在某些变量的末尾附加额外的字符串以避免冲突但是......
我不明白如何 "concat/import" 一个简单的 javascript 文件,它不是 amd/commonjs/es6,而是简单的显示模块 !
我有以下文件结构:
foo.js
var Foo = (function () {
var someMethod = function () {};
return {
someMethod: someMethod
};
})();
bar.js
(function(module) {
module.bar = "bar";
})(Foo);
main.js
import "foo.js"
import "bar.js"
构建后,我得到:
build.js
var Foo = (function () { // Here the problem
var someMethod = function () {};
return {
someMethod: someMethod
};
})();
(function(module) {
module.bar = "bar";
})(Foo); // Ouupss !
那么我怎样才能得到 Foo 而不是 Foo$1 呢?或者 Foo$1 而不是 bar.js 的 Foo ?
编辑:
以防万一,在 main.js 中,我使用视图中的默认导入来覆盖默认名称:
import Foo from "foo.js"
我遇到了这样的错误(正常!):
Non-existent export 'default' is imported from foo.js by main.js
这是一个误解,但在对 Whosebug 和互联网进行研究后,我没有发现如何解决这个棘手的问题。
所以...提前致谢!
Rollup 不会连接 JavaScript 个文件;它将一组 ES2015 模块转换为功能等效的单个脚本。 ES2015 模块的功能不像大多数其他语言中的模块(当然不像 C/C++ #include
s!),and I recommend reading about them here. If you want to import a regular JavaScript file, you'll have to convert it to an ES2015 module, which in a pinch can be done automatically using a Rollup plugin。例如,这是一个糟糕的通用解决方案,但您可以在 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.js 中声明变量 Foo
时,该变量在 bar.js 中不存在。当您尝试访问 bar.js 中名为 Foo
的变量时,它会将其视为全局变量,就好像您没有在任何文件中声明它一样。通过将 foo.js 的 Foo
重命名为 Foo
,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 不能确定第一个,因为它用它的数据做复杂的事情,而不是仅仅使用导出。
虽然 Permutators 的答案在大多数情况下仍然正确,但现在有一个名为 rollup-plugin-legacy 的插件。它允许您将一些任意的 JS 库包装到可与 rollup 一起使用的模块中。我不知道为什么它这么鲜为人知,因为我觉得它非常有用。
只需将其添加为插件即可:
legacy({
"foo.js": "Foo"
})
并将 main.js 中的导入语句更改为:
import Foo from 'foo.js'
首先,我明白为什么 rollup.js 需要在某些变量的末尾附加额外的字符串以避免冲突但是...... 我不明白如何 "concat/import" 一个简单的 javascript 文件,它不是 amd/commonjs/es6,而是简单的显示模块 !
我有以下文件结构:
foo.js
var Foo = (function () {
var someMethod = function () {};
return {
someMethod: someMethod
};
})();
bar.js
(function(module) {
module.bar = "bar";
})(Foo);
main.js
import "foo.js"
import "bar.js"
构建后,我得到:
build.js
var Foo = (function () { // Here the problem
var someMethod = function () {};
return {
someMethod: someMethod
};
})();
(function(module) {
module.bar = "bar";
})(Foo); // Ouupss !
那么我怎样才能得到 Foo 而不是 Foo$1 呢?或者 Foo$1 而不是 bar.js 的 Foo ?
编辑:
以防万一,在 main.js 中,我使用视图中的默认导入来覆盖默认名称:
import Foo from "foo.js"
我遇到了这样的错误(正常!):
Non-existent export 'default' is imported from foo.js by main.js
这是一个误解,但在对 Whosebug 和互联网进行研究后,我没有发现如何解决这个棘手的问题。
所以...提前致谢!
Rollup 不会连接 JavaScript 个文件;它将一组 ES2015 模块转换为功能等效的单个脚本。 ES2015 模块的功能不像大多数其他语言中的模块(当然不像 C/C++ #include
s!),and I recommend reading about them here. If you want to import a regular JavaScript file, you'll have to convert it to an ES2015 module, which in a pinch can be done automatically using a Rollup plugin。例如,这是一个糟糕的通用解决方案,但您可以在 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.js 中声明变量 Foo
时,该变量在 bar.js 中不存在。当您尝试访问 bar.js 中名为 Foo
的变量时,它会将其视为全局变量,就好像您没有在任何文件中声明它一样。通过将 foo.js 的 Foo
重命名为 Foo
,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 不能确定第一个,因为它用它的数据做复杂的事情,而不是仅仅使用导出。
虽然 Permutators 的答案在大多数情况下仍然正确,但现在有一个名为 rollup-plugin-legacy 的插件。它允许您将一些任意的 JS 库包装到可与 rollup 一起使用的模块中。我不知道为什么它这么鲜为人知,因为我觉得它非常有用。
只需将其添加为插件即可:
legacy({
"foo.js": "Foo"
})
并将 main.js 中的导入语句更改为:
import Foo from 'foo.js'