نقوم بتنفيذ مشروع Angular على ESLint ، مع Prettier و Husky و lint-staged

مرحبا يا هابر! اسمي بوغدان ، أعمل في قيادة فريق PIC Digital Front-End. نقوم بتطوير معظم المشاريع على Angular ، وقررت مؤخرًا مراجعة أدلة أسلوبنا ، بالإضافة إلى إضافة أدوات جديدة لعمل أكثر ملاءمة.

بصفتي اللتر ، قررت استخدام ESLint ، حيث يخططون لنقل Angular إليها قريبًا. وفي هذه المقالة ، أرغب في مشاركة الإرشادات الخاصة بالتبديل من TSLint إلى ESLint ، وفي الوقت نفسه أخبر كيفية تشغيل Prettier من ESLint ، وكيفية إضافة قواعد دليل نمط AirBnB ، وكيفية جعل عملية الإقحام مريحة وغير مرئية من خلال تعيين VS Code و Git hooks.

أجمل و ESLint


ESLint هي أداة لتحليل الكود الثابت ، وتنقسم القواعد إلى مجموعتين:

  • التنسيق - لإحضار الكود إلى عرض واحد: أطوال السطور ، والفواصل ، والفواصل المنقوطة ، وما إلى ذلك.
  • جودة الكود - البحث عن قوالب الكود الإشكالية: كود غير ضروري ، أخطاء.

Prettier هو أداة تنسيق تعليمات برمجية تلقائية.

كان السؤال الذي أثار اهتمامي هو: لماذا استخدم Prettier إذا كان بإمكان ESLint أيضًا تنسيق التعليمات البرمجية؟

الجواب بسيط - تنسيق أجمل للرمز بشكل أفضل: يزيل جميع التنسيقات ويعيد كتابة الرمز بالكامل بنمط واحد. يتيح هذا للمطورين نسيان تنسيق التعليمات البرمجية وعدم إضاعة الوقت في مناقشة نمط التعليمات البرمجية للمراجعة. على سبيل المثال ، لدينا سطر طويل من الكود:

صورة

إذا حاولنا تغيير التنسيق من خلال ESLint ، فسيظهر لنا ببساطة خطأ:

eslint example.ts --fix

output:
error    This line has a length of 97. Maximum allowed is 80

يوضح هذا المثال أن اللنتر لا يمكنه دائمًا المساعدة في تنسيق التعليمات البرمجية ، ويمكن للمطورين تنسيق هذه التعليمات البرمجية بطرق مختلفة ، بناءً على اعتباراتهم الشخصية.

إذا قمنا بحفظ أو تنسيق الملف باستخدام Prettier ، فسيأخذ السطر الشكل:

صورة

يوفر Prettier نمطًا موحدًا في جميع أنحاء قاعدة التعليمات البرمجية. لذلك ، يمكن ويجب استخدامه مع ESLint ، ولكنك تحتاج إلى تكوينها بحيث لا تتداخل مع بعضها البعض.

إعداد ESLint


يكمن جوهر الفحص باستخدام ESLint في المحلل اللغوي الذي يحول الشفرة إلى AST (Abstract Syntax Tree) لمزيد من معالجة البرامج ، والمكونات الإضافية التي تحتوي على قواعد ، على سبيل المثال ، القواعد الموصى بها لـ Typeint linting أو قواعد دليل رمز AirBnB.

التركيب


لترحيل تطبيق Angular إلى ESLint ، نحتاج إلى التبعيات التالية:


لتثبيتها ، فقط قم بتشغيل الأمر:

ng add @angular-eslint/schematics

في وقت كتابة هذا التقرير ، لم يكن لدى Typcript-eslint و الزاوي eslint جميع المعادلات للقواعد في تكوين Codelyzer القياسي لـ TSLint ، ولكن معظمها موجود بالفعل. يمكنك مراقبة الحالة الحالية لنقل القواعد من TSLint إلى ESLint في مستودعات Angular ESLint و TypeScript ESLint الأحادية .

التكوين التكوين


كل ما نحتاجه لكتابة تطبيقات Angular ، قمنا بتثبيتها. الآن دعنا ننتقل إلى تكوين ESLint. لنقم بإنشاء ملف .eslintrc.js وإضافة الإعدادات الموصى بها لـ Angular ESLint:

module.exports = {
  extends: ['plugin:@angular-eslint/recommended'],
  rules: {
    '@angular-eslint/directive-selector': [
      'error',
      { type: 'attribute', prefix: 'app', style: 'camelCase' },
    ],
    '@angular-eslint/component-selector': [
      'error',
      { type: 'element', prefix: 'app', style: 'kebab-case' },
    ],
  },
  overrides: [
    //   ,       *.component.ts
    {
      files: ['*.component.ts'],
      parser: '@typescript-eslint/parser',
      parserOptions: {
        ecmaVersion: 2020,
        sourceType: 'module',
      },
      plugins: ['@angular-eslint/template'],
      processor: '@angular-eslint/template/extract-inline-html',
    },
  ],
};

يمكن وصف Configs بتنسيقات مختلفة: JavaScript أو JSON أو YAML. يمكنك ترك التعليقات في جافا سكريبت.

يحتوي "Plugin: @ angular-eslint / Recommended" على إعدادات 3 مكونات إضافية في آن واحد: "@ typescript-eslint / eslint-plugin" و "@ angular-eslint / eslint-plugin" و "@ angular-eslint / eslint-plugin-template " يمكنك قراءة القواعد التي يضعها هنا .

تحديث أمر Ng lint


أيضًا في تكوين angular.json ، تحتاج إلى تحديث الأمر ng lint لتشغيل @ angular-eslint / builder :

"lint": {
  "builder": "@angular-eslint/builder:lint",
  "options": {
    "eslintConfig": ".eslintrc.js",
    "tsConfig": [
      "tsconfig.app.json",
      "tsconfig.spec.json",
      "e2e/tsconfig.json"
    ],
    "exclude": [
      "**/node_modules/**"
    ]
  }
},

إعداد ESLint الأساسي جاهز ، يمكنك الآن بدء ESLint باستخدام الأمر ng lint القياسي .

تثبيت مكونات إضافية


لتثبيت المكوّن الإضافي لـ ESLint ، على سبيل المثال ، لاختبارات وحدة الفحص في Angular ، تحتاج إلى تنزيل وإضافة Jasmine plugin إلى الإعدادات :

npm install eslint-plugin-jasmine --save-dev

وأضف قالب إعدادات جديد للملفات ذات الامتداد * .spec.ts إلى خاصية "تجاوزات":

overrides: [
  ...,
  {
    files: ['src/**/*.spec.ts', 'src/**/*.d.ts'],
    parserOptions: {
      project: './src/tsconfig.spec.json',
    },
    //   
    extends: ['plugin:jasmine/recommended'],
    //    
    plugins: ['jasmine'],
    env: { jasmine: true },
    //   'no-unused-vars'
    rules: {
      '@typescript-eslint/no-unused-vars': 'off',
    },
  }
],

قياسا على ذلك ، يمكنك إضافة ملحقات أخرى لملحقات الملفات المختلفة.

إضافة أدلة دليل النمط


لتحقيق تناسق أكبر لقاعدة التعليمات البرمجية ، يمكنك تحديد وإضافة قواعد أحد أدلة الأنماط الشائعة إلى تكوين ESLint:

  • AirBnB : أكثر الفواصل والفواصل الفاصلة المنقوطة الإلزامية الثلاثة شيوعًا والأكثر صرامة.
  • جوجل : على غرار AirBnB من حيث التنسيق ، ولكن أقل صرامة ، تعليقات JSDoc الإلزامية.
  • StandartJS : يحظر استخدام الفواصل اللاحقة والفواصل المنقوطة.

اختر دليل الأسلوب الأكثر ملاءمة لفريقك. يمكنك أن تتناوب في تجربة كل أدلة الأنماط في بعض المشاريع الكبيرة ، ومعرفة الأخطاء التي ينتجها اللنتر واستنادا إلى هذا الاختيار.

اختر تنفيذ دليل نمط TypeScript لأن قواعد JavaScript قد لا تعمل بشكل صحيح على TypeScript.

كمثال ، دعنا نضيف دليل نمط AirBnB إلى تكوين ESLint. للقيام بذلك ، قم بتثبيت التكوين بقواعد AirBnB لـ TypeScript والمكون الإضافي بقواعد للعمل مع بناء جملة الاستيراد / التصدير:

npm install eslint-plugin-import eslint-config-airbnb-typescript --save-dev

لكي لا نغير إعدادات المستوى الأعلى ، سننشئ كتلة جديدة من القواعد في خاصية "تجاوزات" مع قواعد دليل نمط AirBnB ومحلل TypeScript الضروري لعملهما:

module.exports = {
  ...,
  overrides: [
    ...,
    {
      files: ['*.ts'],
      extends: [
        'airbnb-typescript/base',
      ],
      parser: '@typescript-eslint/parser',
      parserOptions: {
        ecmaVersion: 2020,
        sourceType: 'module',
      },
    },
  ]
}

لإضافة دليل نمط آخر ، تحتاج إلى تثبيت مجموعة من القواعد لـ TypeScript ، وإنشاء كتلة جديدة من القواعد في "تجاوزات" مع قواعد دليل النمط وتحديد المحلل اللغوي اللازم لعملهم.

قواعد التخصيص


إذا كنت ترغب في تعطيل أو إعادة تعريف بعض القواعد في نمط الدليل ، يمكنك القيام بذلك في خاصية "القواعد":

module.exports = {
  ...,
  overrides: [
    ...,
    {
      files: ['*.ts'],
      extends: [
        'airbnb-typescript/base',
      ],
      parser: '@typescript-eslint/parser',
      parserOptions: {
        ecmaVersion: 2020,
        sourceType: 'module',
      },
      //  
      rules: {
        'import/no-unresolved': 'off',
        'import/prefer-default-export': 'off',
        'class-methods-use-this': 'off',
        'lines-between-class-members': 'off',
        '@typescript-eslint/unbound-method': [
          'error',
          {
            ignoreStatic: true,
          },
        ],
      },
    },
  ]
}


تكوين أجمل


لإضافة Prettier إلى تكويننا ، نحتاج إلى تثبيت Prettier نفسه ، وهو مكون إضافي بقواعد Prettier ، بالإضافة إلى تهيئة ستعطل جميع القواعد التي قد تتعارض مع Prettier:

npm i prettier eslint-config-prettier eslint-plugin-prettier --save-dev

في "تجاوزات" في الكتلة مع قواعد الملفات ذات الامتداد * .ts في الخاصية "يمتد" في الجزء السفلي ، أضف القواعد وإعدادات أجمل:

module.exports = {
  ...,
  overrides: [
    ...,
    {
      files: ['*.ts'],
      extends: [
        //   AirBnB
	'airbnb-typescript/base',
	//   Prettier
	'prettier/@typescript-eslint',
	'plugin:prettier/recommended',
      ],
      ...,
    },
  ]
}

يجب أن يكون تكوين Prettier دائمًا في أسفل القائمة لاستبدال أي قواعد قد تتعارض مع Prettier.

`prettier / @ typescript-eslint` يعطل قواعد` @ typescript-eslint` ، التي قد تتعارض مع Prettier ، ويقوم `plugin: prettier / Recommended` بثلاثة أشياء:

  • يتضمن eslint-plugin-prettier ،
  • طباعة أخطاء قاعدة أجمل / أجمل إلى وحدة التحكم على أنها "خطأ" ،
  • يضيف قواعد تنسيق Prettier eslint-config-prettier.

التكوين لجمال:


يمكن لـ Prettier تنسيق الرمز بدون أي إعدادات ، ولكن لمطابقة دليل نمط AirBnB ، تحتاج إلى إضافة بعض الإعدادات. قم بإنشاء ملف. prettierrc.js في جذر التطبيق:

module.exports = {
  trailingComma: "all",
  tabWidth: 2,
  semi: true,
  singleQuote: true,
  bracketSpacing: true,
  printWidth: 100
};

سيتم استخدام هذه الإعدادات من قبل كل من ESLint و Prettier إذا كنت تستخدمها لتنسيق الملفات في VS Code أو باستخدام الأمر:

prettier "--write ."

تكوين رمز VS


يمكن لـ VS Code تمييز وتصحيح أخطاء ESLint التي تم العثور عليها عند حفظ الأخطاء. للقيام بذلك ، قم بتنزيل البرنامج المساعد ESLint لـ VS Code وقم بإنشاء ملف داخل المشروع مع إعدادات مساحة العمل. vscode / settings.json:

  "eslint.validate": [ "javascript", "typescript", "html"],

  "eslint.options": {
    "extensions": [".js", ".ts", "html"]
  },

  "editor.codeActionsOnSave": {
    "source.fixAll.eslint": true,
  },

نقوم هنا بتكوين ESLint للتأكيد على الأخطاء وتصحيحها عند حفظ الملفات ذات الامتدادات js. و ts. و html. ولتنسيق

مستند باستخدام تركيبات المفاتيح "shift + option + F" أو "shift + alt + F" ، قم بتنزيل المكون الإضافي Prettier لـ VS Code وتعيينه كمنسق افتراضي.

إنشاء خطافات بوابة


خطافات Git هي نصوص برمجية يستدعيها Git في أحداث معينة: الالتزام ، الدفع ، الاستلام.

بمساعدة منهم ، يمكننا أن نبدأ في إرسال الكود عند إنشاء التزام بحيث تحصل أخطاء أقل في تجمع الطلبات. للعمل أكثر ملاءمة مع بوابة السنانير، وتثبيت الاسكيمو ، وللتحقق فقط رمز التي يتم إضافتها إلى ارتكاب (وهذا مفيد في المشاريع الكبيرة التي يجري فيها linting الكثير من الوقت) لينت-نظموا :

npm i husky lint-staged --save-dev

أضف الإعدادات لهذه الإضافات إلى package.json:

"scripts": {
  ...
},
"husky": {
  "hooks": {
    "pre-commit": "lint-staged --relative"
  }
},
"lint-staged": {
  "*.{js,ts}": [
     "eslint --fix"
  ]
},

يمرر لينتد صفيف من الملفات المعدلة إلى الأمر المطلوب. لا يعرف الأمر ng lint كيفية قبول مصفوفة من الملفات ، لاستخدامه ، تحتاج إلى كتابة معالج نصوص إضافي. أو يمكنك فقط استدعاء ESLint ، كما في هذا المثال. يمكن استخدام مثل هذا الحل للطلبات المسبقة ، ويمكنك تشغيل ng lint لإسقاط المشروع بأكمله ، على سبيل المثال ، في خط أنابيب CI.

الموجودات


في الإصدارات المستقبلية من Angular ، سيكون ESLint مع القواعد الأساسية خارج الصندوق. تتطلب الآن عملية تكوين ESLint بعض الخطوات الإضافية ، ولا تحتوي ESLint على مكافئات لبعض القواعد من TSLint ، ولا تزال Angular ESLint في إصدار ألفا. لذلك ، فإن التحول إلى ESLint الآن أم لا هو أمر متروك لك.

ومع ذلك ، فإن كود الدليل ، والقواعد الإضافية ، و Prettier و Husky و lint-staged ، سيكون عليك تكوين نفسك. آمل أن تكون هذه المقالة قد ساعدتك على معرفة كيف تعمل كل هذه الأشياء معًا.

قد يبدو تكوين linters مهمة تافهة ، ولكنه يتضمن العديد من القضايا التنظيمية الهامة: اختيار أدلة النمط ، ومزامنة الحلول المختلفة مع بعضها البعض.

لكن الوقت الذي يقضيه في تكوين اللتر في المستقبل سيوفر لك الوقت بشكل كبير في مناقشة نمط وتنسيق التعليمات البرمجية في عملية مراجعة التعليمات البرمجية ، وتقليل عدد الأخطاء التي تقع في تجمع الطلبات ، وضمان اتساق قاعدة التعليمات البرمجية.

يمكن العثور على مثال تنفيذي على Github .

إذا وجدت خطأ في التكوين ، أو لديك وظائف إضافية - اكتب!

المراجع



All Articles