Razzle: рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рдПрд╕реНрд▓рд┐рдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ?

рдХреЛ рдирд┐рд░реНрдорд┐рдд 12 рдирд╡ре░ 2019  ┬╖  11рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: jaredpalmer/razzle

рдореИрдВрдиреЗ razzle-eslint-plugin рдЬреЛрдбрд╝рд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЕрдкрдиреЗ razzle.config.js рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рд╣реИ

plugins: ['scss', 'eslint']

рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдХрдВрд╕реЛрд▓ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреА рдЪреЗрддрд╛рд╡рдиреА рдирд╣реАрдВ рджрд┐рдЦрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдореИрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХрдВрд╕реЛрд▓ рд╕реЗ рдПрд╕реНрд▓рд┐рдВрдЯ рдЪрд▓рд╛рддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рд▓рд┐рдВрдЯ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди razzle start рдЪрд▓рд╛рддреЗ рд╕рдордп рдирд╣реАрдВ

razzle-eslint-plugin рд╕реНрд░реЛрдд рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдкрд░, рдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рдерд╛ рдХрд┐ рдирд┐рдпрдо рдХреЗрд╡рд▓ js рдФрд░ jsx рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ

 config.module.rules = [
    {
      test: /\.(js|jsx|mjs)$/,
      enforce: 'pre',
      loader: require.resolve('eslint-loader'),
      options: mainEslintOptions,
      exclude: /node_modules/,
    },
    ...config.module.rules,
  ]

рдЕрдЧрд░ рдореИрдВ рдЙрдкрд░реЛрдХреНрдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдореЗрдВ ts|tsx рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рддреБрд░рдВрдд рдЪреЗрддрд╛рд╡рдиреА рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВред рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ node_modules unde module.rules.push рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдирдП рдирд┐рдпрдо рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдкрд░рд┐рдгрд╛рдо These relative modules were not found: рддреНрд░реБрдЯрд┐

рдЕрдЧрд░ рдЗрд╕реЗ razzle-eslint-plugin рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддреЛ рдореИрдВ рдПрдХ PR рдмрдврд╝рд╛ рд╕рдХрддрд╛ рд╣реВрдВред рдХреГрдкрдпрд╛ рд╕реБрдЭрд╛рд╡ рджреЗ

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

2019 рдореЗрдВ ESLint рдХреЗ рд▓рд┐рдП Tslint рдХреЛ рдкрджрд╛рд╡рдирдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдпрд╣ рдирд╡рдВрдмрд░ рдХреЗ рдордзреНрдп рдореЗрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП razzle рдХреЛ рд╢рд╛рдпрдж ESLint рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдиреА рдЪрд╛рд╣рд┐рдПред

рд╕рднреА 11 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореИрдВрдиреЗ рдЕрдкрдиреЗ razzle.config.js рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рджрд░реНрдЬ рдХреА рд╣реИрдВ:

'use strict'

module.exports = {
  plugins: [
    {
      name: 'typescript',
      options: {
        useBabel: true,
        useEslint: true,
        forkTsChecker: {
          tsconfig: './tsconfig.json',
          tslint: undefined,
          watch: './src',
          typeCheck: true
        }
      }
    }
  ]
}

рдФрд░ рдлрд┐рд░ .eslintrc.json рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ

{
  "extends": [
    "eslint:recommended",
    "prettier",
    "plugin:jsx-a11y/recommended",
    "plugin:@typescript-eslint/recommended",
    "plugin:react/recommended"
  ],
  "plugins": ["@typescript-eslint"],
  "parser": "@typescript-eslint/parser",
  "parserOptions": {
    "ecmaVersion": 6,
    "sourceType": "module",
    "ecmaFeatures": {
      "modules": true,
      "jsx": true
    }
  },
  "env": {
    "browser": true,
    "node": true,
    "jest": true
  },
  "settings": {
    "react": {
      "version": "detect"
    },
    "import/resolver": {
      "node": {
        "extensions": [".js", ".jsx", ".ts", ".tsx"]
      }
    }
  }
}

рдФрд░ рдлрд┐рд░ рдореЗрд░реЗ package.json рд▓рд╛рдЗрдирд┐рдВрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рдкрдВрдХреНрддрд┐ рдореЗрдВ:

"lint": "eslint --ext 'js,jsx,ts,tsx' .",

@andersnylund рдЖрдкрдХреЗ рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдЙрдкрд░реЛрдХреНрдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╕рд╛рде, рдореИрдВ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реВрдВред рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдХреЛрдИ рдЪреЗрддрд╛рд╡рдиреА рдирд╣реАрдВ рд╣реИред рдореИрдВ npm run lint рдЪрд▓рд╛рдХрд░ рдХрдИ рд▓рд┐рдВрдЯ рдЪреЗрддрд╛рд╡рдиреА рджреЗрдЦ рд╕рдХрддрд╛ рдерд╛ред рдпрд╣ рдПрдХ рдмреЗрд╣рддрд░ рдЕрдиреБрднрд╡ рд╣реЛрдЧрд╛ рдпрджрд┐ рдореИрдВ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдареАрдХ рдЙрд╕реА рддрд░рд╣ рдЪреЗрддрд╛рд╡рдиреА рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдЬреИрд╕реЗ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрд░рд┐рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдВ рд╣реИ

рдпрд╣ рдореЗрд░рд╛ рд╡рд░реНрддрдорд╛рди рд╡рд┐рдиреНрдпрд╛рд╕ рд╣реИред

const path = require('path')
module.exports = {
  plugins: ['scss', 'eslint'],
  modify(defaultConfig, { target, dev }, webpack) {
    const config = defaultConfig
    config.resolve.extensions.push('.ts', '.tsx')
    config.module.rules.push({
      test: /\.(ts|js)x?$/,
      exclude: /node_modules/,
      loader: 'babel-loader',
    })

    if (target === 'node' && !dev) {
      config.entry = path.resolve(__dirname, './src/server.tsx')
      config.output.filename = 'server.bundle.js'
      config.output.path = path.resolve(__dirname, './build')
      config.output.libraryTarget = 'commonjs2'
    }
    return config
  }
}

2019 рдореЗрдВ ESLint рдХреЗ рд▓рд┐рдП Tslint рдХреЛ рдкрджрд╛рд╡рдирдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдпрд╣ рдирд╡рдВрдмрд░ рдХреЗ рдордзреНрдп рдореЗрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП razzle рдХреЛ рд╢рд╛рдпрдж ESLint рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдиреА рдЪрд╛рд╣рд┐рдПред

рдЕрдВрдд рдореЗрдВ, рдореИрдВ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдВрд╕реЛрд▓ рдкрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдФрд░ ESLint рдЪреЗрддрд╛рд╡рдиреА рджреЛрдиреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛ред

const ForkTSCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin')
const path = require('path')

module.exports = {
  modify(defaultConfig, { target, dev }, webpack) {
    const config = defaultConfig
    config.resolve.extensions.push('.ts', '.tsx')
    config.plugins.push(
        new ForkTSCheckerWebpackPlugin({
          checkSyntacticErrors: true,
          eslint: true,
        }))
    config.module.rules.push({
      test: /\.(ts|js)x?$/,
      include: [path.resolve(__dirname, 'src')],
      loader: 'babel-loader',
    })
 }
}

рдФрд░ рдореЗрд░реЗ рдкрд╛рд╕ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд╛рд░реНрд╕рд░ рдХреЗ рд╕рд╛рде рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░реВрдЯ рдкрд░ рдореЗрд░реА .eslintrc рдлрд╝рд╛рдЗрд▓ рд╣реИ

@ 85n2 @ aswin-s рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд░реЗрдХ-рдкреНрд▓рдЧрдЗрди-рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдлреЛрд░реНрдХ рдЯреАрдПрд╕ рдЪреЗрдХрд░ рд╡реЗрдмрдкреИрдХ рдкреНрд▓рдЧрд┐рди рдкреБрд░рд╛рдирд╛ рд╣реИ (v0.4.1) рдФрд░ рдпрд╣ рдПрд╕реНрд▓реЗрдВрдЯ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореИрдВрдиреЗ # 1174 рдореЗрдВ рдкреНрд▓рдЧрдЗрди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреАрдЖрд░ рдмрдирд╛рдпрд╛ рд╣реИ

рдХреНрдпрд╛ рдпрд╣ рдкреАрдЖрд░ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ?

@ рдХрд▓реНрдкрдирд╛ 10255 рдпрд╣ рдПрдХ рдкреАрдЖрд░ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рд▓рд┐рдП рдпреЛрдЬрдирд╛ рд╣реИ

рд╣рдо рдХреБрдЫ рд╣рдлрд╝реНрддреЗ рдореЗрдВ razzle-plugin-eslint рдХрд╛ рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рдорд░реНрдерди рд╕реЗ рдЬрд╛рд░реА рдХрд░реЗрдВрдЧреЗ

@ nimaa77 рдзрдиреНрдпрд╡рд╛рдж, рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдПрдХреАрдХреГрдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ?

@ nimaa77 рдХреЛрдИ рдЕрдкрдбреЗрдЯ? рдпрд╛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП?

рдпрд╣ рд╕рдВрднрд╡ рд╣реИред рд╣рдордиреЗ рдЕрдм рдЪрд░реНрдЪрд╛рдУрдВ рдХреЛ рд╕рдХреНрд╖рдо рдХрд┐рдпрд╛ рд╣реИред рдХреГрдкрдпрд╛ рдЗрд╕реЗ рд╡рд╣рд╛рдВ рд▓реЗ рдЬрд╛рдПрдВ :) рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдирдП рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд▓рдЧрдЗрди рдПрд╕реНрд▓рд┐рдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕