使用 @rollup/plugin-commonjs

问题描述

我正在使用为 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] = brunmode.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],...

编辑

目前我的 rollup.config.js 文件

        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 (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...