При импорте uuid в накопительный пакет библиотека ESM создает оператор импорта для «crypto» в выходном файле. - PullRequest
1 голос
/ 27 января 2020

Редактировать: для большей ясности добавлена ​​конфигурация плагинов


Я использую пакет uuid в сворачиваемом проекте. Сначала я получал предупреждение о внешней зависимости crypto . Поэтому я добавил external и output.globals в свою конфигурацию накопительного пакета:

export default [{
  input: '/path/to/input.js',
  external: ['crypto'],
  output: {
    file: '/path/to/output.esm.js',
    format: 'esm',
    ...
    globals: {
      crypto: 'crypto'
    }
  },
  plugins: [
    resolve({
      customResolveOptions: {
        moduleDirectory: 'node_modules'
      },
      preferBuiltins: true
    }),
    commonjs({
      namedExports: {
        uuid: ['v4']
      }
    })
  ]
}];

Предупреждение исчезло, но теперь в моем выходном файле есть оператор import:

output.esm . js

import crypto from 'crypto';
...

Мой вопрос, будет ли это работать, если я включу output.esm.js в браузер?

<script type="module" src="/path/to/output.esm.js"></script>

1 Ответ

2 голосов
/ 08 февраля 2020

Сначала я получал предупреждение о криптографии внешних зависимостей

Это потому, что Rollup не знает, хотите ли вы использовать встроенный в узел crypto или внешний пакет , @rollup/plugin-node-resolve preferBuiltins используется для выбора одного из этих вариантов.

Итак, я добавил external и output.globals в свою конфигурацию накопительного пакета

Эти параметры вместе с preferBuiltins: true предписывает Rollup использовать встроенный узел crypto без его связывания (следовательно, оператор импорта все еще присутствует в выходном файле).

Однако, если вашей целевой средой является браузер, вам следует используйте альтернативу браузера , предоставляемую uuid, которая использует Web Crypto API вместо crypto узла. Для этого должно быть достаточно следующей конфигурации Rollup:

// rollup.config.js

export default [{
  input: ...,
  output: {
    file: ...,
    format: 'esm',
  },
  plugins: [
    resolve({
        browser: true, // This instructs the plugin to use
                       // the "browser" property in package.json
    }),
    commonjs(),
  ],
}];

Просто из любопытства:

Мой вопрос, будет ли это работать, если я добавлю output.esm . js в браузере?

<script type="module" src="/path/to/output.esm.js"></script>

Нет, не будет; главным образом потому, что браузеры не понимают спецификации пустых модулей (import crypto from 'crypto' вместо './path/to/crypto.js'). Кроме того, согласно вашей конфигурации Rollup crypto рассматривается как встроенный nodejs, который недоступен в браузере, если не входит в комплект:)

...