使用 Rollup 混合默认导出和命名导出

Luk*_*kas 8 javascript npm typescript

我正在使用 TypeScript 和 Rollup为 Node.js编写一个蓝牙库。我想让用户以这些方式导入我的库组件

import Sblendid from "@sblendid/sblendid";
import Sblendid, { Peripheral } from "@sblendid/sblendid";

const Sblendid = require("@sblendid/sblendid");
const { Peripheral } = require("@sblendid/sblendid");
Run Code Online (Sandbox Code Playgroud)

我的项目结构如下所示:

root
 ? rollup.config.ts
 ? src
    ? index.ts
    ? sblendid.ts
    ? peripheral.ts
Run Code Online (Sandbox Code Playgroud)

相应的代码是这样的:

index.ts

export {
  default,
} from "./sblendid";

export {
  default as Peripheral,
} from "./peripheral";
Run Code Online (Sandbox Code Playgroud)

sblendid.ts

export default class Sblendid {}
Run Code Online (Sandbox Code Playgroud)

peripheral.ts

export default class Peripheral {}
Run Code Online (Sandbox Code Playgroud)

我用 Rollup 捆绑了所有东西,我的整个配置是这样的:

import typescript from "typescript";
import commonjs from "rollup-plugin-commonjs";
import resolve from "rollup-plugin-node-resolve";
import typescriptPlugin from "rollup-plugin-typescript2";
import autoExternal from "rollup-plugin-auto-external";
import { terser } from "rollup-plugin-terser";
import pkg from "./package.json";

export default {
  input: "src/index.ts",
  output: [
    {
      file: pkg.main,
      format: "cjs",
      sourcemap: true
    },
    {
      file: pkg.module,
      format: "es",
      sourcemap: true
    }
  ],
  plugins: [
    autoExternal(),
    resolve({ preferBuiltins: true }),
    commonjs(),
    typescriptPlugin({ typescript, objectHashIgnoreUnknownHack: true }),
    terser()
  ]
};
Run Code Online (Sandbox Code Playgroud)

你可以在这里找到完整的代码

https://github.com/LukasBombach/sblendid/tree/master/packages/sblendid

现在,此设置不起作用。汇总告诉我

$ rollup -c rollup.config.ts

src/index.ts ? dist/index.cjs.js, dist/index.es.js...
(!) Mixing named and default exports
Consumers of your bundle will have to use bundle['default'] to access the default export, which may not be what you want. Use `output.exports: 'named'` to disable this warning
Run Code Online (Sandbox Code Playgroud)

这是真的。这个

const Sblendid = require("@sblendid/sblendid");
Run Code Online (Sandbox Code Playgroud)

根本行不通。我要做的是:

const Sblendid = require("@sblendid/sblendid").default;
Run Code Online (Sandbox Code Playgroud)

我可以通过混合命名广告默认导出来修复此行为,好的,但随后我失去了执行此操作的能力:

import Sblendid, { Peripheral } from "@sblendid/sblendid";
Run Code Online (Sandbox Code Playgroud)

所以我想知道。有什么办法,也许使用多个捆绑包,我可以实现让用户能够同时做到:

// This
import Sblendid from "@sblendid/sblendid";
import Sblendid, { Peripheral } from "@sblendid/sblendid";

// And this
const Sblendid = require("@sblendid/sblendid");
const { Peripheral } = require("@sblendid/sblendid");
Run Code Online (Sandbox Code Playgroud)

小智 1

如果您仅针对nodejs环境,您可以像这样导出(index.ts)

import Sblendid from "./sblendid";
import Peripheral from "./peripheral";

Sblendid.Peripheral = Peripheral;
export default Sblendid;
Run Code Online (Sandbox Code Playgroud)