Как запретить Webpack читать (исключать) недоступные файлы путем встряхивания дерева?

Похоже, что функция встряхивания дерева в Webpack помогает удалить неиспользуемый код из пакета. Однако Webpack читает эти нечитаемые файлы. Как мне запретить Webpack их читать?

Вот пример:

index.js

import { bar } from './bar';

bar();

бар / index.js

export { bar } from './bar';
export { foo } from './foo';

bar / foo.js

import fs from 'fs';

export function foo() {}

webpack.config.js

const path = require('path');

module.exports = {
  entry: './src/index.js',
  mode: 'production',
  module: {
    rules: [
      { sideEffects: false }
    ],
  },
  optimization: {
    usedExports: true
  },
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'bundle.js'
  }
};

Запуск Webpack приводит к следующей ошибке: ERROR in ./src/bar/foo.js Module not found: Error: Can't resolve 'fs' in "/temp/webpack-test/src/bar'

Я ожидаю, что Webpack не прочитает файл foo.js, потому что нет маршрута от точки входа к этому файлу.


person David    schedule 14.08.2020    source источник


Ответы (1)


Это работает, как ожидалось.

Есть маршрут:

  1. ./src/index.js:
import { bar } from './bar';

- ›по умолчанию маршрутизация в {папку} /index.js, если bar - это каталог

  1. bar / index.js:
export { foo } from './foo';

--- ›export .. from .. синтаксис также импортирует указанный файл:

  1. бар / foo.js
import fs from 'fs';

Вы получаете

Error: Can't resolve 'fs' in "/temp/webpack-test/src/bar'

потому что fs недоступен в конфигурации target: web webpack по умолчанию. Вы можете обойти это следующим образом:

node: {
   fs: "empty"
},

но некоторые вещи могут не работать.

person Raz Ronen    schedule 16.08.2020
comment
Спасибо, Раз. Меня не беспокоит ошибка. Это было сделано только для демонстрации того факта, что Webpack проанализировал файл src/bar/foo.js. Поскольку foo не был экспортирован в основной src/index.js файл, я ожидаю, что этот файл будет проигнорирован. - person David; 18.08.2020
comment
Встряхивание дерева - это оптимизация, поэтому оно работает после того, как модули будут проанализированы и собраны. Интересно услышать мнение сообщества о том, должен ли webpack вообще анализировать эти файлы. Возможно, в будущих версиях это не будет - person Raz Ronen; 18.08.2020