Заставьте Webpack 4 импортировать только cjs и никогда esm с помощью typescript

#typescript #webpack #package.json #redux-toolkit #tsconfig

Вопрос:

Приложение, построенное на webpack@4.43.0 ; машинописный текст 4.2.4;

Попытка установки и использования @reduxjs/toolkit в приложении приведет к ошибкам сборки:

 ERROR in ./node_modules/@reduxjs/toolkit/dist/redux-toolkit.esm.js
Module not found: Error: Can't resolve 'immer' in './node_modules/@reduxjs/toolkit/dist'
 

Как отключить импорт модулей esm из пути «модуль» библиотеки package.json и использовать только «основную» точку входа в webpack?

пакет.json из @reduxjs/toolkit

   "main": "dist/index.js",
  "module": "dist/redux-toolkit.esm.js",
  "unpkg": "dist/redux-toolkit.umd.min.js",
  "types": "dist/index.d.ts",
 

наши конфигурации:
tsconfig.json

     "target": "es6",
    "jsx": "react",
    "module": "commonjs",
    "lib": [
      "es6",
      "dom",
      "esnext",
      "esnext.asynciterable"
    ],
    "strict": true,
    "sourceMap": true,
    "moduleResolution": "node",
    "allowSyntheticDefaultImports": true,
    "esModuleInterop": true,
 

webpack.config.js

 const HappyPackConfig = new HappyPack({
  id: 'ts',
  threads: 2,
  loaders: [
    {
      path: 'ts-loader',
      query: { happyPackMode: true },
      options: {
        transpileOnly: true,
      },
    },
  ],
});

module.exports = {
  node: {
    net: 'mock',
  },
  entry: ['whatwg-fetch', './src/index.tsx'],
  output: {
    path: path.resolve('dist'),
    filename: '[name].bundle.[contenthash].js',
    publicPath: '/',
    globalObject: 'this',
  },
  devtool: process.env.NODE_ENV === 'development' ? 'inline-source-map' : false,
  devServer: {
    https: true,
    historyApiFallback: true,
    watchOptions: {
      ignored: /node_modules/,
    },
  },
  optimization: { ... },
  module: {
    rules: [
      {
        test: /.tsx?$/,
        exclude: //node_modules/,
        use: { loader: 'happypack/loader?id=ts' },
      },
    ],
  },
};
 

package.json не содержит "type": "module"
и мы не используем babel

Ответ №1:

Добавление следующих параметров в webpack.config.js помощь в моем случае:

 module.exports = {
/* ... */
resolve: {
    /* ... */
    mainFields: ['browser', 'main'],
  },
};