ESLintの仕組み
2019-05-29 金谷敦志
ESLint - The pluggable linting utility for
JavaScript and JSX
公式サイトおよびGitHubリポジトリ
● JavaScript界におけるLinterのデファクトスタンダード
○ Lintはコードを静的解析してバグやスタイル違反を指摘するツール
○ 昔はJSLint, JSHintがあったが、ESLintに取って代わられた
● 今日は下記3点について
○ ESLintのコードチェック方法
○ Pluggableとは?
○ JavaScriptコーディング規約を変えよう
※使い方の話はないので、Getting Started with ESLintを見てね
2
ESLintのコードチェック方法
3
ESLintのコードチェック方法
基本的な流れ
※Architectureを読んでからコードを読むと理解が早まる
1. コンフィグの読み込み(詳細は割愛)
2. 抽象構文木を作成
3. ルールベースのチェック
4. レポート出力
4
抽象構文木を作成
5
> var espree = require('espree')
> var res = espree.parse("var name = 'eslint';")
> JSON.stringify(res)
{"type":"Program",
"start":0,
"end":20,
"body":[
{"type":"VariableDeclaration",
"start":0,
"end":20,
"declarations":[
{"type":"VariableDeclarator",
"start":4,
"end":19,
"id":{"type":"Identifier","start":4,"end":8,"name":"name"},
"init":{"type":"Literal","start":11,"end":19,"value":"eslint","raw":"'eslint'"}
}
],
"kind":"var"
}
],
"sourceType":"script"
}
ルールベースのチェック
● ESLintが標準で持っているルール(およびソースコード)
● ソースコードから生成された抽象構文木に対してルールを適用する
● 例: space-before-function-paren.js
○ var f = function () {}
■ leftTokenは {"type":"Keyword","start":287,"end":295,"value":"function"}
■ rightTokenは {"type":"Punctuator","start":296,"end":297,"value":"("}
■ 294文字目と296文字目の間にスペースがあることが分かる
○ fix可能なルールで fixオプションがついていれば、その場で直す
6
レポート出力
12:8 error Missing JSDoc parameter type for 'response' valid-jsdoc
12:8 error Missing JSDoc parameter description for 'response' valid-jsdoc
15:5 error Expected method shorthand object-shorthand
15:32 error Unexpected space before function parentheses space-before-function-paren
16:9 error Expected line before comment lines-around-comment
17:51 error Expected '===' and instead saw '==' eqeqeq
7
各種形式でレポート出力できる(ソースコード)
下記はデフォルト(stylish.sh)例だが、JUnit形式で出力してCIに食わせることもできる
余談
ESLintのlintingの仕組みを知っておくとプログラミングの可能性が広がる(特に抽象構文木)
● 字句解析
● 構文解析
JavaScriptのminifyの実装ができる
上記に意味解析も加えると、コンパイラの実装ができる
そこまでいかなくても、ドメイン固有言語(特に外部DSL)の設計実装ができるかも
8
Pluggableとは?
9
Pluggableとは?
あまり知らないので調べてみたが、これも同様にドキュメントがしっかり書かれている
● ルール
● プラグインで下記をまとめ上げたものを提供できる
○ ルール
○ コンフィグ
○ 事前事後作業
● レポートのフォーマッタ
○ グラフ出力は便利
● パーザまでも(espreeが返すノードと同じインターフェースにすればOKらしい)
10
プラグインの作り方
"use strict";
// Requirements 必要に応じて利用したいライブラリを書く
var requireIndex = require("requireindex");
// Plugin Definition
// import all rules in lib/rules ここにプラグインが読み込みたいルールを格納しておけばOK
module.exports.rules = requireIndex(__dirname + "/rules");
// import processors (必要に応じてjs以外にも対応できるように。 .jsxや.vueなどが対象?)
module.exports.processors = {
// add your processors here
};
11
余談
プラグインの仕組みを理解しておくとプログラミングの可能性が広がる
● プラグインのインターフェース設計
● プラグインがあるフォルダからのソースの読み込み
● インターフェースに定義のある通りにプラグインを実行
Webアプリケーションフレームワークなどで、上記のことをやっている
12
JavaScriptコーディング規約を変えよう
13
当社におけるJavaScriptコーディング規約
当社におけるJavaScriptコーディング規約(公開に当たり社内リンクを消しています)
● コードのフォーマットはESLintで頑張ればできる
● エラー指摘もeslint:recommended を利用すればできる
● でも…これ守ってるチームはあるのだろうか
● 守っていないのであれば、これを守るようなESLintプラグイン開発の意味はあるのか
14
ESLintが普及した最大の理由
コーディング規約を公開できる& 必要に応じてオーバーライドして使える
有名ドコロ
● Airbnb JavaScript Style Guide (いち早くES2015に対応したことで有名)
● eslint-config-google
● JavaScript Standard Style
● (有名ではないがESLintもESLintでコーディング規約を書いている)
15
JavaScript Standard Styleの提案
https://standardjs.com/
● 俺達がスタンダードだと言わんばかりの名前
● 採用している組織が多い
● セミコロン不要!(一番議論を醸す部分)
● 当社におけるJavaScriptコードの傾向を調べていないが、なるべく移行負担の少ない規約を採用したい
● 何にせよ、有名ドコロのコーディング規約を利用して、遵守しやすい状態にしたい
16
余談
セミコロンは必要だろ常識的に考えて。という方向けの、semistandard もあります
● 基本、JavaScript Standard Styleと同じ
● 違いはセミコロン必須なこと!
○ あとセミコロン重複も NG
17
まとめ
● ESLintのコードチェック方法
○ 抽象構文木を作る
○ ルールを適用する
○ フォーマットしてレポート出力する
● ESLintの拡張性、再利用性が高い
● 世のコーディング規約にのっかろう(意見募集)
● 学んだ知識を応用しよう
18

More Related Content

PDF
文字コードに起因する脆弱性とその対策(増補版)
PDF
Springを何となく使ってる人が抑えるべきポイント
PDF
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
PDF
Observable Everywhere - Rxの原則とUniRxにみるデータソースの見つけ方
PDF
「今日から使い切る」 ための GNU Parallel による並列処理入門
PDF
プログラムを高速化する話
PPTX
画像処理の高性能計算
PDF
こわくない Git
文字コードに起因する脆弱性とその対策(増補版)
Springを何となく使ってる人が抑えるべきポイント
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
Observable Everywhere - Rxの原則とUniRxにみるデータソースの見つけ方
「今日から使い切る」 ための GNU Parallel による並列処理入門
プログラムを高速化する話
画像処理の高性能計算
こわくない Git

What's hot (20)

PDF
Apache Spark + Arrow
PPTX
C#や.NET Frameworkがやっていること
PDF
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
PDF
入社1年目のプログラミング初心者がSpringを学ぶための手引き
PDF
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
PDF
Rpn and forth 超入門
PPTX
JSX 速さの秘密 - 高速なJavaScriptを書く方法
PDF
Twitterのsnowflakeについて
PDF
シェーダだけで世界を創る!three.jsによるレイマーチング
PDF
使ってみよう PowerShell
PDF
実践QBVH
PPTX
Yarn resource-manager
PDF
RでGARCHモデル - TokyoR #21
PDF
Webと経済学 數見拓朗
PDF
Java8でRDBMS作ったよ
PDF
MySQL 8.0で憶えておいてほしいこと
PDF
LLVM最適化のこつ
PPTX
できる!KickstartとAnsible!
PDF
今日からできる!簡単 .NET 高速化 Tips
PDF
Pythonによる黒魔術入門
Apache Spark + Arrow
C#や.NET Frameworkがやっていること
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
入社1年目のプログラミング初心者がSpringを学ぶための手引き
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Rpn and forth 超入門
JSX 速さの秘密 - 高速なJavaScriptを書く方法
Twitterのsnowflakeについて
シェーダだけで世界を創る!three.jsによるレイマーチング
使ってみよう PowerShell
実践QBVH
Yarn resource-manager
RでGARCHモデル - TokyoR #21
Webと経済学 數見拓朗
Java8でRDBMS作ったよ
MySQL 8.0で憶えておいてほしいこと
LLVM最適化のこつ
できる!KickstartとAnsible!
今日からできる!簡単 .NET 高速化 Tips
Pythonによる黒魔術入門
Ad

More from 株式会社MonotaRO Tech Team (20)

PDF
20240522 Findy Event ビジネスの構造をアーキテクチャに落とし込みソフトウェアに可変性を注入する.pdf
PDF
本番環境でやらかしちゃった選手権_MonotaRO社内LT会利用スライド.pdf
PDF
この技術書がすごい!2023夏(おすすめの技術書をペライチで紹介する選手権) .pdf
PDF
PyConAPAC2023 ワークフローエンジン Apache Airflowを用いた 大規模データパイプライン構築と改善
PDF
【TECHTRACKJP】私ってデータエンジニアなんですか?気づいたらデータエンジニアと呼ばれるようになった私がこの職種について考えた【20230725】
PDF
【マーケティング・テクノロジーフェア 大阪 2023】 データから正しい意思決定を行うために 〜全社横断で実施したデータ活用プロジェクトの取...
PDF
[ITmedia Cloud Native 2023] モノタロウのクラウドネイティブ.pdf
PDF
datatech-jp Casual Talks #5_データ基盤の立ち位置を考えるのに チームトポロジーの概念を活用した話
PDF
モノタロウの1900万商品を検索する Elasticsearch構築運用事例(2022-10-26 第50回Elasticsearch 勉強会発表資料)
PDF
JDMC LT#1 - なぜモノタロウでデータマネジメントが必要になったのか
PDF
datatech-jp Casual Talks#3 データエンジニアを採用するための試行錯誤
PDF
信頼性とアジリティを同時に上げろ!モノタロウのカナリアリリース導入.pdf
PDF
データ基盤に関わる問い合わせ対応を仕組みで解決する
PDF
モノタロウの開発・リリースサイクルを支えるJenkinsの活用事例 - Jenkins Day Japan 2021
PDF
「指標」を支えるエンジニアリング: DataOpsNight #1
PDF
データ管理に重要なことは事業と組織の理解だった(Data Engineering Study #11 発表資料)
PDF
MonotaRO のデータ活用と基盤の過去、現在、未来
PDF
全社のデータ活用を一段階上げる取り組み
PDF
データ基盤グループを支えるチームビルディング
PDF
モノタロウECプラットフォームを支える開発運用モダナイゼーションの取り組み #devsumi
20240522 Findy Event ビジネスの構造をアーキテクチャに落とし込みソフトウェアに可変性を注入する.pdf
本番環境でやらかしちゃった選手権_MonotaRO社内LT会利用スライド.pdf
この技術書がすごい!2023夏(おすすめの技術書をペライチで紹介する選手権) .pdf
PyConAPAC2023 ワークフローエンジン Apache Airflowを用いた 大規模データパイプライン構築と改善
【TECHTRACKJP】私ってデータエンジニアなんですか?気づいたらデータエンジニアと呼ばれるようになった私がこの職種について考えた【20230725】
【マーケティング・テクノロジーフェア 大阪 2023】 データから正しい意思決定を行うために 〜全社横断で実施したデータ活用プロジェクトの取...
[ITmedia Cloud Native 2023] モノタロウのクラウドネイティブ.pdf
datatech-jp Casual Talks #5_データ基盤の立ち位置を考えるのに チームトポロジーの概念を活用した話
モノタロウの1900万商品を検索する Elasticsearch構築運用事例(2022-10-26 第50回Elasticsearch 勉強会発表資料)
JDMC LT#1 - なぜモノタロウでデータマネジメントが必要になったのか
datatech-jp Casual Talks#3 データエンジニアを採用するための試行錯誤
信頼性とアジリティを同時に上げろ!モノタロウのカナリアリリース導入.pdf
データ基盤に関わる問い合わせ対応を仕組みで解決する
モノタロウの開発・リリースサイクルを支えるJenkinsの活用事例 - Jenkins Day Japan 2021
「指標」を支えるエンジニアリング: DataOpsNight #1
データ管理に重要なことは事業と組織の理解だった(Data Engineering Study #11 発表資料)
MonotaRO のデータ活用と基盤の過去、現在、未来
全社のデータ活用を一段階上げる取り組み
データ基盤グループを支えるチームビルディング
モノタロウECプラットフォームを支える開発運用モダナイゼーションの取り組み #devsumi
Ad

MonotaRO LT - ESLintの仕組み