问题描述
我正在使用为 cjs 编写的 javascript 库。我还使用 @rollup/plugin-commonjs 来转换该库,以便我可以导入它。
// a file I want to import from cjs library
exports.x = 5
// rollup.config.js
resolve({
browser: true,dedupe: ['svelte'],preferBuiltins: false,}),commonjs({
include: [
"node_modules/**",],dynamicRequireTargets: [
"node_modules/cjs-lib/**",
我正在尝试在我自己的应用中使用它。
import lib from "cjs-lib/file.js"
lib.z = function() {
return lib.x + 5;
}
出现问题,
Uncaught TypeError: lib.x is not a function
似乎所有在 cjs 库中定义的方法(如 exports.x
)在导入时都是未定义的。
无论如何配置 @rollup/plugin-commonjs
使得最初在 cjs 库中的 exports
对象在我的应用程序中导入时成为默认导出对象?
编辑:
更具体地说,我使用的确切库是 CodeMirror,我正在尝试使用它的插件 runmode/runmode.node.js
。
import CodeMirror from 'codemirror/addon/runmode/runmode.node';
import 'codemirror/mode/Meta';
// Try to extend it here,but findModeByExtension is undefined.
CodeMirror.findMode = function (mode) {
return mode && (CodeMirror.findModeByExtension(mode) ||
CodeMirror.findModeByFileName(mode) ||
CodeMirror.findModeByName(mode) ||
CodeMirror.findModeByMIME(mode) ||
CodeMirror.findModeByMode(mode));
};
通过汇总,导入的 CodeMirror
对象为空,{}
。但是对于 webpack,CodeMirror
对象包含在 exports.x = y
文件中使用 exports[a] = b
和 runmode.node.js
分配给它的所有方法。
编辑:
令人惊讶的是,如果在 rollup.config.js
内导入库,则导入的对象不为空并且包含所有预期的方法。
// rollup.config.js
import * as CodeMirror from "codemirror/addon/runmode/runmode.node"
console.log("CodeMirror",CodeMirror);
runmode [Object: null prototype] {
StringStream: [Getter],countColumn: [Getter],...
编辑:
commonjs({
include: "node_modules/**",dynamicRequireTargets: ["node_modules/codemirror/**"],
如果没有在 codemirror
中包含 dynamicRequireTargets
,当涉及到 require is undefined
中的这些行时会导致 runmode.node.js
错误:
require.cache[require.resolve("../../lib/codemirror")] = require.cache[require.resolve("./runmode.node")];
require.cache[require.resolve("../../addon/runmode/runmode")] = require.cache[require.resolve("./runmode.node")];
dynamicRequireTargets
似乎通过将整个文件包装在这个中来解决这个问题
const commonjsRegister = require('commonjsHelpers.js?commonjsRegister');
commonjsRegister("/$$rollup_base$$/node_modules/codemirror/addon/runmode/runmode.node.js",function (module,exports) {
'use strict';
// runmode.node.js
}
但是,这会删除所有导出,因此会删除空导入。有没有办法将 dynamicRequireTargets
和 cjs 导出一起使用?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)