网站搜索

typescript - 如何配置 rollup js 打包 Node 模块的 CommonJS


我有一个简单的 TypeScript 应用程序,我在浏览器中运行它。为了打包 TypeScript 文件,我使用了 Rollup JS。

我安装了扩散软件包

npm install diffusion

并将模块导入到我的 ts 文件 app.ts 中:

import * as diffusion from 'diffusion';

diffusion.connect({/* options */});

现在,当我在浏览器中启动应用程序时,会出现以下情况:

diffusion.js:5 Uncaught ReferenceError: exports is not defined
    at diffusion.js:5:23

这是导致错误的那行代码:

Object.defineProperty(exports, "__esModule", { value: true });

问题是如何使用 Rollup 正确打包一个使用 CommonJS 的节点模块。

这是我当前的 rollup.config.mjs 文件:

import { createSpaConfig } from '@open-wc/building-rollup';
import typescript from '@rollup/plugin-typescript';
import merge from 'deepmerge';
import nodeResolve from "@rollup/plugin-node-resolve";
import commonjs from "@rollup/plugin-commonjs";

const baseConfig = createSpaConfig({
  outputDir: 'dist',
  nodeResolve: { browser: true, dedupe: ['lit-html'] },
  developmentMode: process.env.ROLLUP_WATCH === 'true',
  html: {
    extractAssets: false,
    minify: false,
  },
  injectServiceWorker: false,
  legacyBuild: false,
  workbox: false,
});


export default merge(baseConfig, {
  input: 'index.html',
  plugins: [
    typescript({
      declaration: false,
      sourceMap: false,
      inlineSources: false,
      compilerOptions: {
        target: 'esnext',
      },
    }),
    nodeResolve(),
    commonjs({
      include: /node_modules/,
      sourceMap: false,
    })
  ]
});

tsconfig.json

{
  "compilerOptions": {
    "target": "ES2021",
    "module": "ESNext",
    "esModuleInterop": true,
    "moduleResolution": "node",
    "declaration": true,
    "sourceMap": true,
    "importHelpers": true,
    "inlineSources": true,
    "strict": true,
    "noFallthroughCasesInSwitch": true,
    "noImplicitReturns": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "experimentalDecorators": true,
    "useDefineForClassFields": false,
    "allowJs": true,
    "maxNodeModuleJsDepth": 2,
    "allowSyntheticDefaultImports": true,
    "typeRoots": ["node_modules/@types"]
  },
  "include": ["src/**/*"]
}

编辑

我尝试在这里重现该应用,使用 parcel(不幸的是,我无法在 codesandbox.io 内使用 web-dev-server 和 rollup 启动该应用,但我在那里提供了与我本地使用的相同的应用结构)。

这个应用在 Parcel 上运行良好,但当我用 Rollup 构建它时:

npm run build

并使用 web-dev-server 启动它

npm start

使用以下构建和启动脚本:

{ ...
  "build": "rimraf dist/ && rollup --config"
  "start": "web-dev-server --watch"   
... }

我在本地遇到这个错误:diffusion.js:5 Uncaught ReferenceError: exports is not defined 如何使用 rollup js 修复它?

编辑 2

我刚注意到,在构建应用程序之后,如果我将打包后的 main.js 文件添加到我的 index.html 条目中,它就可以正常工作,所以基本上我缺少的是配置 rollup 将打包文件注入到我的 index.html 文件中,但不知道该如何添加?