рдореИрдВрдиреЗ 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 рдмрдврд╝рд╛ рд╕рдХрддрд╛ рд╣реВрдВред рдХреГрдкрдпрд╛ рд╕реБрдЭрд╛рд╡ рджреЗ
рдореИрдВрдиреЗ рдЕрдкрдиреЗ 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 рдХреЛрдИ рдЕрдкрдбреЗрдЯ? рдпрд╛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП?
рдпрд╣ рд╕рдВрднрд╡ рд╣реИред рд╣рдордиреЗ рдЕрдм рдЪрд░реНрдЪрд╛рдУрдВ рдХреЛ рд╕рдХреНрд╖рдо рдХрд┐рдпрд╛ рд╣реИред рдХреГрдкрдпрд╛ рдЗрд╕реЗ рд╡рд╣рд╛рдВ рд▓реЗ рдЬрд╛рдПрдВ :) рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдирдП рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд▓рдЧрдЗрди рдПрд╕реНрд▓рд┐рдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
2019 рдореЗрдВ ESLint рдХреЗ рд▓рд┐рдП Tslint рдХреЛ рдкрджрд╛рд╡рдирдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдпрд╣ рдирд╡рдВрдмрд░ рдХреЗ рдордзреНрдп рдореЗрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП razzle рдХреЛ рд╢рд╛рдпрдж ESLint рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдиреА рдЪрд╛рд╣рд┐рдПред