Vyhledávání na webu

javascript - Jak používat webpack s babel-loader a flow


Mám potíže s něčím, co podle mě nemělo být příliš složité nastavit. Chci, aby tyto tři technologie spolupracovaly:

  • webpack k balení kódu
  • babel, abych byl schopen psát moderní JavaScript
  • Flow protože kontrola typů je užitečná stejně jako testy a linter

Už jsem prošel několika nastaveními tohoto, ale žádný z článků, které jsem našel na internetu, se nezdá být užitečný.

Definoval jsem 3 skripty v mém package.json, run, flow a build. Kontrola typů pomocí yarn run flow funguje perfektně, a stejně tak i spuštění skriptu přes babel-node pomocí yarn run start.

Ale když spustím yarn run build, objeví se následující chyba přes webpack:

./node_modules/webpack/bin/webpack.js
Hash: 207d42dac5784520fc99
Version: webpack 3.10.0
Time: 49ms
    Asset     Size  Chunks             Chunk Names
bundle.js  2.65 kB       0  [emitted]  main
   [0] ./src/main.js 181 bytes {0} [built] [failed] [1 error]

ERROR in ./src/main.js
Module parse failed: Unexpected token (3:5)
You may need an appropriate loader to handle this file type.
| // @flow
|
| type Foo = {
|   foo: string,
| };
error Command failed with exit code 2.

Zdá se mi, že typové anotace nejsou odstraněny správně v tom správném okamžiku. Bohužel se to stane i v případě, že přímo ve Webpacku určím možnosti Babel místo v souboru .babelrc.

To mě momentálně zrazuje při seskupování spousty souborů .js při použití flow a zatímco jsem našel několik pluginů, které údajně odstraňují anotace flow, zdá se, že samotné použití přednastavení flow je to, co doporučuje flowtype.org.

Pro reprodukovatelnost vypadají moje projektové soubory takto:

package.json:

{
  …
  "dependencies": {},
  "devDependencies": {
    "babel-cli": "^6.26.0",
    "babel-core": "^6.26.0",
    "babel-eslint": "^8.0.3",
    "babel-loader": "^7.1.2",
    "babel-preset-env": "^1.6.1",
    "babel-preset-flow": "^6.23.0",
    "flow-bin": "^0.60.1",
    "webpack": "^3.9.1"
  },
  "scripts": {
    "build": "./node_modules/webpack/bin/webpack.js",
    "start": "./node_modules/babel-cli/bin/babel-node.js src/main.js",
    "flow": "./node_modules/flow-bin/cli.js"
  }
}

.flowconfig:

[include]
./src

[ignore]

[libs]

[lints]

[options]

.babelrc:

 {
   "presets": ["env", "flow"]
 }

webpack.config.js:

const path = require('path');
const webpack = require('webpack');

module.exports = {
  entry: './src/main.js',
  output: {
    path: __dirname,
    filename: 'bundle.js',
  },
  resolve: {
    modules: [
      path.resolve('./src/'),
      'node_modules',
    ],
    extensions: ['.js'],
  },
  module: {
    rules: [
      {
        test: '/.js$/',
        loader: 'babel-loader',
      },
    ],
  },
};

src/main.js:

// @flow

type Foo = {
  foo: string,
};

const defaultFoo: Foo = {
  foo: 'bar',
};

console.log(defaultFoo);

Odpověď č. 1

Stáhněte příslušné přednastavení a přidejte je do souboru webpack.config.js takto:

module: {
  rules: [
    {
      test: /\.js$/,
      exclude: /(node_modules|bower_components)/,
      use: {
        loader: 'babel-loader',
        options: {
          presets: ['es2015', 'stage-0', 'react']
        }
      }
    }
  ]
}

Odpověď č. 2

Podařilo se mi také najít rychlý a snadný způsob...

https://babeljs.io/docs/babel-preset-flow

Můj soubor .babelrc vypadá takto

{
 "presets": [["@babel/preset-env"],["@babel/preset-flow"]]
}

a nainstalujte přednastavení Flow

npm install --save-dev @babel/preset-flow