Π― Π΄ΠΎΠ±Π°Π²ΠΈΠ» ΠΏΠ»Π°Π³ΠΈΠ½ razzle-eslint ΠΈ Π²ΠΊΠ»ΡΡΠΈΠ» Π΅Π³ΠΎ Π² ΡΠ²ΠΎΠΉ razzle.config.js, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ
plugins: ['scss', 'eslint']
ΠΡΠΎΠ±Π»Π΅ΠΌΠ° Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΊΠΎΠ½ΡΠΎΠ»Ρ Π½Π΅ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅Ρ Π½ΠΈΠΊΠ°ΠΊΠΈΡ
ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠΉ ΠΎ Π²ΠΎΡΡΠΈΠ½Π°Ρ
Π΄Π»Ρ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΌΠ°ΡΠΈΠ½ΠΎΠΏΠΈΡΠ½ΠΎΠ³ΠΎ ΡΠ΅ΠΊΡΡΠ°. ΠΡΠ»ΠΈ Ρ Π²ΡΡΡΠ½ΡΡ Π·Π°ΠΏΡΡΡΠΈΠ» eslint Ρ ΠΊΠΎΠ½ΡΠΎΠ»ΠΈ, Ρ ΠΌΠΎΠ³ Π±Ρ ΡΠ²ΠΈΠ΄Π΅ΡΡ ΠΎΡΠΈΠ±ΠΊΠΈ lint, Π½ΠΎ Π½Π΅ ΠΏΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ 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
Π² ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΡ Π²ΡΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ, Ρ ΡΠΌΠΎΠ³Ρ ΡΡΠ°Π·Ρ ΡΠ²ΠΈΠ΄Π΅ΡΡ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΡ. ΠΠΎ ΡΡΠΎ ΡΡΠ΅Π±ΡΠ΅Ρ ΡΡΡΠ½ΠΎΠ³ΠΎ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠ°ΠΉΠ»Π° unde node_modules
ΡΠ΅Π³ΠΎ Ρ Π±Ρ Ρ
ΠΎΡΠ΅Π» ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ. ΠΡΡΡ Π»ΠΈ ΡΠΏΠΎΡΠΎΠ± ΡΠ°ΡΡΠΈΡΠΈΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΈΠ· razzle.config.js? Π― ΠΏΠΎΠΏΡΡΠ°Π»ΡΡ ΠΏΡΠΎΡΠΎΠ»ΠΊΠ½ΡΡΡ Π½ΠΎΠ²ΠΎΠ΅ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ ΡΠ΅ΡΠ΅Π· 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 Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ Π·Π° Π²Π°Ρ Π²ΠΊΠ»Π°Π΄. Π‘ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π²ΡΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠ΅ΠΉ Ρ ΠΌΠΎΠ³Ρ Π²ΠΈΠ΄Π΅ΡΡ ΠΎΡΠΈΠ±ΠΊΠΈ ΠΌΠ°ΡΠΈΠ½ΠΎΠΏΠΈΡΠ½ΠΎΠ³ΠΎ ΡΠ΅ΠΊΡΡΠ° Π² ΠΊΠΎΠ½ΡΠΎΠ»ΠΈ. ΠΠΎ Π²ΡΠ΅ ΠΆΠ΅ Π½ΠΈΠΊΠ°ΠΊΠΈΡ
ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠΉ eslint. Π― ΠΌΠΎΠ³ Π²ΠΈΠ΄Π΅ΡΡ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠΉ ΠΎ Π»ΠΈΠ½ΡΠ°Ρ
, Π²ΡΠΏΠΎΠ»Π½ΠΈΠ² npm run lint
. ΠΡΠ»ΠΎ Π±Ρ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Π»ΡΡΡΠ΅, Π΅ΡΠ»ΠΈ Π±Ρ Ρ ΠΌΠΎΠ³ Π²ΠΈΠ΄Π΅ΡΡ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΡ ΠΏΡΡΠΌΠΎ Π² ΠΊΠΎΠ½ΡΠΎΠ»ΠΈ, ΠΊΠ°ΠΊ Π² ΠΏΡΠΎΠ΅ΠΊΡΠ°Ρ
cra.
ΠΡΠΎ ΠΌΠΎΠΉ ΡΠ΅ΠΊΡΡΠΈΠΉ ΠΊΠΎΠ½ΡΠΈΠ³.
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
}
}
Tslint ΡΡΡΠ°ΡΠ΅Π» Π΄Π»Ρ ESLint Π³Π΄Π΅-ΡΠΎ Π² 2019 Π³ΠΎΠ΄Ρ, ΠΈ ΡΠ΅ΠΉΡΠ°Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΡΠ΅ΡΠ΅Π΄ΠΈΠ½Π° Π½ΠΎΡΠ±ΡΡ, ΠΏΠΎΡΡΠΎΠΌΡ razzle, Π²Π΅ΡΠΎΡΡΠ½ΠΎ, Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΏΠ»Π°Π½ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Π° Π½Π° ESLint.
ΠΠ°ΠΊΠΎΠ½Π΅Ρ, ΠΌΠ½Π΅ ΡΠ΄Π°Π»ΠΎΡΡ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΊΠ°ΠΊ ΠΎΡΠΈΠ±ΠΊΠΈ Typescript, ΡΠ°ΠΊ ΠΈ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΡ 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
Π² ΠΊΠΎΡΠ½Π΅ ΠΏΡΠΎΠ΅ΠΊΡΠ° Ρ ΠΏΠ°ΡΡΠ΅ΡΠΎΠΌ ΠΌΠ°ΡΠΈΠ½ΠΎΠΏΠΈΡΠ½ΠΎΠ³ΠΎ ΡΠ΅ΠΊΡΡΠ°
@ fifn2 @ aswin-s ΠΡΠΎΠ±Π»Π΅ΠΌΠ° Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΏΠ»Π°Π³ΠΈΠ½ Fork TS Checker Webpack, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ razzle-plugin-typescript, ΡΡΡΠ°ΡΠ΅Π» (v0.4.1) ΠΈ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ eslint. Π― ΡΠΎΠ·Π΄Π°Π» PR Π΄Π»Ρ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΠΏΠ»Π°Π³ΠΈΠ½Π° Π² # 1174
ΠΠΎΡΠΎΠ² Π»ΠΈ ΡΡΠΎΡ PR ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ?
@Image10255 ΡΡΠΎ Π½Π΅ ΠΏΠΈΠ°Ρ, Π½ΠΎ Ρ Π½Π°Ρ Π΅ΡΡΡ ΠΏΠ»Π°Π½Ρ Π½Π° ΡΡΠΎΡ
ΡΠ΅ΡΠ΅Π· ΠΏΠ°ΡΡ Π½Π΅Π΄Π΅Π»Ρ ΠΌΡ Π²ΡΠΏΡΡΡΠΈΠΌ Π½ΠΎΠ²ΡΡ Π²Π΅ΡΡΠΈΡ razzle-plugin-eslint
Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΎΠΉ ΠΌΠ°ΡΠΈΠ½ΠΎΠΏΠΈΡΠ½ΠΎΠ³ΠΎ ΡΠ΅ΠΊΡΡΠ°
@ nimaa77 Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ, Ρ ΡΠ΅ΠΉΡΠ°Ρ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΡΡ ΠΌΠ°ΡΠΈΠ½ΠΎΠΏΠΈΡΠ½ΡΠΉ ΡΠ΅ΠΊΡΡ, Π΅ΡΡΡ Π»ΠΈ ΡΠΏΠΎΡΠΎΠ± ΡΠ½Π°ΡΠ°Π»Π° Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ?
@ nimaa77 ΠΊΠ°ΠΊΠΎΠ΅-Π½ΠΈΠ±ΡΠ΄Ρ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅? ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ-Π½ΠΈΠ±ΡΠ΄Ρ ΠΏΠΎΠΌΠΎΡΡ?
ΠΡΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. Π£ Π½Π°Ρ Π΅ΡΡΡ ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΡ Π½Π° github. ΠΠΎΠΆΠ°Π»ΡΠΉΡΡΠ°, ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΡΠΈΡΠ΅ ΡΡΠΎ ΡΡΠ΄Π° :) Π’Π°ΠΊΠΆΠ΅ Π½ΠΎΠ²ΡΠΉ ΠΏΠ»Π°Π³ΠΈΠ½ typescript Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ eslint.
Π‘Π°ΠΌΡΠΉ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ
Tslint ΡΡΡΠ°ΡΠ΅Π» Π΄Π»Ρ ESLint Π³Π΄Π΅-ΡΠΎ Π² 2019 Π³ΠΎΠ΄Ρ, ΠΈ ΡΠ΅ΠΉΡΠ°Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΡΠ΅ΡΠ΅Π΄ΠΈΠ½Π° Π½ΠΎΡΠ±ΡΡ, ΠΏΠΎΡΡΠΎΠΌΡ razzle, Π²Π΅ΡΠΎΡΡΠ½ΠΎ, Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΏΠ»Π°Π½ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Π° Π½Π° ESLint.