Cum să construiești Typescript cu pachete importate corespunzător pentru IE11 folosind Bable 7 și Webpack 4?


Recent, am lansat o versiune nouă a unei aplicații React, dar a cauzat ca IE11 să se plângă de cuvântul cheie let.

Când m-am uitat mai atent, am descoperit că era pentru că am actualizat pachetul query-string de la 5.1.0 la 6.4.0, iar noul cod folosea cuvântul cheie let așa cum se vede aici. Și se pare că procesul nostru de build nu a compilat pachetele importate din es6 în es5.

Folosim typescript cu babel 7 și webpack 4, totul este bine pentru propriul nostru cod și pentru majoritatea pachetelor, cu excepția query-string.

Următoarele sunt configurațiile noastre, vă rugăm să sugerați cea mai bună metodă de a rezolva problema.

webpeck.config:

  {
    test: /\.(t|j)sx?$/,
    exclude: /node_modules/,
    use: [
      { loader: 'babel-loader' },
      {
        loader: 'ts-loader',
        options: { transpileOnly: true }
      }
    ]
  }

tsconfig.json:

{
  "compilerOptions": {
    "target": "esnext",
    "module": "esnext",
    "allowJs": true,
    "allowSyntheticDefaultImports": true,
    "forceConsistentCasingInFileNames": true,
    "lib": ["webworker", "esnext", "dom"],
    "sourceMap": true,
    "baseUrl": ".",
    "paths": {
      "*": ["./src/*"]
    },
    "jsx": "preserve",
    "strict": true,
    "moduleResolution": "node",
    "esModuleInterop": true
  },
  "include": ["./src/**/*", "./**/*.d.ts"],
  "exclude": ["node_modules"]
}

.babelrc

  const presets = [
    '@babel/preset-typescript',
    '@babel/preset-react',
    [
      '@babel/preset-env',
      {
        targets: {
          // React parses on ie 9, so we should too
          ie: 9
        },
        forceAllTransforms: true,
        // Disable polyfill transforms
        useBuiltIns: false,
        // Do not transform modules to CJS
        modules: false
      }
    ]
  ]

fișier sursă exemplu

  import queryStringLib from 'query-string'
  queryStringLib.stringify(...)

Apropo, am încercat să elimin exclude node_modules atât în webpack.config, cât și în tsconfig.json, nu funcționează. De asemenea, am încercat să schimb tsconfig.json pentru a ținti es5, nici asta nu funcționează.

Actualizare #1 Tocmai am încercat, va funcționa, dacă elimin exclude node_modules atât din webpack.config, cât și din tsconfig.json, și schimb tsconfig.json pentru a targeta es5. Totuși, va face computerul mult mai ocupat decât înainte. Nu este o soluție perfectă.

Mulțumesc, Ron

Răspuns #1

Pentru mine, a funcționat dacă am schimbat webpack.config în:

{
    test: /\.(t|j)sx?$/,
    exclude: /node_modules(?!(\/|\\)query-string)/,
    use: [
      { loader: 'babel-loader',
        options: {
          presets: ['@babel/preset-env']
        }
      },
      {
        loader: 'ts-loader',
        options: { transpileOnly: true }
      }
    ]
  }

Cu alte cuvinte, excludeți toate celelalte node_modules, cu excepția query-string, și adăugați @babel/preset-env ca opțiune preset pentru babel-loader (babel-loader nu funcționa corect fără aceasta).

Nicio modificare la tsconfig.json.