【问题标题】:Rollup can't see named export from commonjs module汇总看不到来自 commonjs 模块的命名导出
【发布时间】:2018-01-04 18:23:23
【问题描述】:

我有一个简单的 AWS Lambda 函数 (state-info.ts),我正在用 Rollup 摇树,它给了我以下错误:

[!] 错误:'DB' 不是由 ../../forest-fire/abstracted-admin/lib/index.js 导出的

https://github.com/rollup/rollup/wiki/Troubleshooting#name-is-not-exported-by-module
src/state-info.ts (10:9)
8: import { Lambda } from "aws-sdk";
9: import { STATES } from "./models/shared";
10: import { DB } from "abstracted-admin";
            ^
11: import { StateInfo } from "./models/StateInfo";
12: import { IApiResponse } from "./shared/ApiRetriever";

现在碰巧我写了它抱怨的模块abstracted-admin(目前在 npm 上的 v0.6.5),它确实将 DB 导出为命名导出( 作为默认导出)。但是由于某种原因,Rollup 不高兴。

我为完整的上下文创建了所有内容的视频演练:video

对于那些不喜欢视频的人,这里是关键事实/文件:

abstracted-admin/lib/index.d.ts:

import { DB } from "./db";
export default DB;
export { DB, IFirebaseConfig, IFirebaseListener } from "./db";

abstracted-admin/lib/index.js:

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const db_1 = require("./db");
exports.default = db_1.DB;
var db_2 = require("./db");
exports.DB = db_2.DB;

并来自abstracted-admin/package.json

{
  ...
  "files": ["lib"],
  "main": "lib/index.js",
  "typings": "lib/index.d.ts",
}

state-info.ts(也就是正在汇总的文件):

import {
  IDictionary,
  AWSGatewayCallback,
  IAWSGatewayRequest,
  IAWSGatewayResponse
} from "common-types";
import GetStateInfo from "./vote-smart/get-state-info";
import { Lambda } from "aws-sdk";
import { STATES } from "./models/shared";
import { DB } from "abstracted-admin";
import { StateInfo } from "./models/StateInfo";
import { IApiResponse } from "./shared/ApiRetriever";
/** ... */

同时我的汇总配置是:

import cjs from "rollup-plugin-commonjs";
import resolve from "rollup-plugin-node-resolve";
import json from "rollup-plugin-json";
import ts from "rollup-plugin-typescript2";
import globals from "rollup-plugin-node-globals";

export default {
  input: "src/state-info.ts",
  output: {
    file: "lib/state-info-rolled.js",
    format: "cjs"
  },
  external: ["aws-sdk"],
  plugins: [
    globals(),
    json(),
    cjs({
      include: "node_modules/**",
      exclude: ["node_modules/aws-sdk/**"]
    }),
    ts(),
    resolve({
      jsnext: true,
      main: true,
      browser: false,
      preferBuiltins: false,
      extensions: [".js", ".json"]
    })
  ]
};

【问题讨论】:

    标签: node.js typescript rollup rollupjs


    【解决方案1】:

    我相信 Rollup 在这种情况下预计会出现以下情况:

    import admin from "abstracted-admin";
    const { DB } = admin;
    

    这与 Webpack 的行为不同,已经抓到我好几次了。

    【讨论】:

    • 这对我来说没有意义......命名导出是“DB”,我也导出默认导出(与 DB 命名导出相同的导出)。因此,在您的示例中,import admin from “abstracted-admin”;“admin”将等同于命名的 DB 导出。
    • 在视频中你可以看到 vs-code 的 linter 很清楚这个命名导出的存在
    • 我无法评论 VS Code 看到的内容,但 Rollup 对此有点特别,主要是由于 CommonJS 的限制:github.com/rollup/rollup/wiki/…
    • 是的,我查看了 wiki 的那个部分,但我是依赖关系图两端的作者,所以我确保结构与 commonjs 一样好。
    • 不太确定什么汇总失败,但您可能想尝试namedExports 选项:github.com/rollup/rollup-plugin-commonjs#custom-named-exports
    猜你喜欢
    • 2016-12-24
    • 2020-11-11
    • 2017-03-19
    • 2018-01-06
    • 1970-01-01
    • 2020-04-24
    • 2018-03-16
    • 2021-08-24
    • 1970-01-01
    相关资源
    最近更新 更多