SlideShare una empresa de Scribd logo
1 de 18
Descargar para leer sin conexión
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

Más contenido relacionado

La actualidad más candente

La actualidad más candente (20)

脱 Excel設計書
脱 Excel設計書脱 Excel設計書
脱 Excel設計書
 
今から始めようMicrosoft PowerApps! (2017年版) - 吉田の備忘録
今から始めようMicrosoft PowerApps! (2017年版) - 吉田の備忘録今から始めようMicrosoft PowerApps! (2017年版) - 吉田の備忘録
今から始めようMicrosoft PowerApps! (2017年版) - 吉田の備忘録
 
Akka actorを何故使うのか?
Akka actorを何故使うのか?Akka actorを何故使うのか?
Akka actorを何故使うのか?
 
今さら聞けない人のためのDevOps超入門
今さら聞けない人のためのDevOps超入門今さら聞けない人のためのDevOps超入門
今さら聞けない人のためのDevOps超入門
 
イケてない開発チームがイケてる開発を始めようとする軌跡
イケてない開発チームがイケてる開発を始めようとする軌跡イケてない開発チームがイケてる開発を始めようとする軌跡
イケてない開発チームがイケてる開発を始めようとする軌跡
 
App013 ここはあえて紙と
App013 ここはあえて紙とApp013 ここはあえて紙と
App013 ここはあえて紙と
 
xv6のコンテキストスイッチを読む
xv6のコンテキストスイッチを読むxv6のコンテキストスイッチを読む
xv6のコンテキストスイッチを読む
 
C#メタプログラミング概略 in 2021
C#メタプログラミング概略 in 2021C#メタプログラミング概略 in 2021
C#メタプログラミング概略 in 2021
 
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門
 
ハンドノート T字形ERモデル セミナー資料 (Author; S.Toriyabe SYSTEMS DESIGN Co.,Ltd. Japan)
ハンドノート T字形ERモデル セミナー資料 (Author; S.Toriyabe  SYSTEMS DESIGN Co.,Ltd. Japan) ハンドノート T字形ERモデル セミナー資料 (Author; S.Toriyabe  SYSTEMS DESIGN Co.,Ltd. Japan)
ハンドノート T字形ERモデル セミナー資料 (Author; S.Toriyabe SYSTEMS DESIGN Co.,Ltd. Japan)
 
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのかDDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
 
Webブラウザで動くOSSオフィスソフト、LibreOffice Onlineの中身に迫る / LibreOffice Online Implementa...
Webブラウザで動くOSSオフィスソフト、LibreOffice Onlineの中身に迫る / LibreOffice Online Implementa...Webブラウザで動くOSSオフィスソフト、LibreOffice Onlineの中身に迫る / LibreOffice Online Implementa...
Webブラウザで動くOSSオフィスソフト、LibreOffice Onlineの中身に迫る / LibreOffice Online Implementa...
 
Re: ゼロから始める監視設計
Re: ゼロから始める監視設計Re: ゼロから始める監視設計
Re: ゼロから始める監視設計
 
ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割
ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割
ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割
 
WPF開発での陥りやすい罠
WPF開発での陥りやすい罠WPF開発での陥りやすい罠
WPF開発での陥りやすい罠
 
コンピュータシステムの理論と実装1
コンピュータシステムの理論と実装1コンピュータシステムの理論と実装1
コンピュータシステムの理論と実装1
 
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
 
シリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのかシリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのか
 
ハードコア デバッギング : サポート直伝!運用中 Windows アプリケーション バグバスター!!
ハードコア デバッギング : サポート直伝!運用中 Windows アプリケーション バグバスター!!ハードコア デバッギング : サポート直伝!運用中 Windows アプリケーション バグバスター!!
ハードコア デバッギング : サポート直伝!運用中 Windows アプリケーション バグバスター!!
 
イケてる技術で品質を担保しつつスピード感のある開発を実現する冴えたやり方
イケてる技術で品質を担保しつつスピード感のある開発を実現する冴えたやり方イケてる技術で品質を担保しつつスピード感のある開発を実現する冴えたやり方
イケてる技術で品質を担保しつつスピード感のある開発を実現する冴えたやり方
 

Similar a MonotaRO LT - ESLintの仕組み

関数型言語ElixirのIoTシステム開発への展開
関数型言語ElixirのIoTシステム開発への展開関数型言語ElixirのIoTシステム開発への展開
関数型言語ElixirのIoTシステム開発への展開
Hideki Takase
 
PHPカンファレンス関西 2011
PHPカンファレンス関西 2011PHPカンファレンス関西 2011
PHPカンファレンス関西 2011
Takako Miyagawa
 

Similar a MonotaRO LT - ESLintの仕組み (20)

関数型言語ElixirのIoTシステム開発への展開
関数型言語ElixirのIoTシステム開発への展開関数型言語ElixirのIoTシステム開発への展開
関数型言語ElixirのIoTシステム開発への展開
 
関数型言語ElixirのIoTシステムへの導入に向けた基礎評価
関数型言語ElixirのIoTシステムへの導入に向けた基礎評価関数型言語ElixirのIoTシステムへの導入に向けた基礎評価
関数型言語ElixirのIoTシステムへの導入に向けた基礎評価
 
パターンでわかる! .NET Coreの非同期処理
パターンでわかる! .NET Coreの非同期処理パターンでわかる! .NET Coreの非同期処理
パターンでわかる! .NET Coreの非同期処理
 
サーバサイドエンジニアが 1年間まじめにSPAやってみた
サーバサイドエンジニアが 1年間まじめにSPAやってみたサーバサイドエンジニアが 1年間まじめにSPAやってみた
サーバサイドエンジニアが 1年間まじめにSPAやってみた
 
Code igniter + ci phpunit-test
Code igniter + ci phpunit-testCode igniter + ci phpunit-test
Code igniter + ci phpunit-test
 
PHPカンファレンス関西 2011
PHPカンファレンス関西 2011PHPカンファレンス関西 2011
PHPカンファレンス関西 2011
 
Big Data入門に見せかけたFluentd入門
Big Data入門に見せかけたFluentd入門Big Data入門に見せかけたFluentd入門
Big Data入門に見せかけたFluentd入門
 
C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1
 
Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)
 
Example of exiting legacy system
Example of exiting legacy systemExample of exiting legacy system
Example of exiting legacy system
 
Closure CompilerのES6対応 あるいはES6時代のAltJS生存戦略
Closure CompilerのES6対応 あるいはES6時代のAltJS生存戦略Closure CompilerのES6対応 あるいはES6時代のAltJS生存戦略
Closure CompilerのES6対応 あるいはES6時代のAltJS生存戦略
 
js-ctypes - ネイティブコードを呼び出す新しいカタチ
js-ctypes - ネイティブコードを呼び出す新しいカタチjs-ctypes - ネイティブコードを呼び出す新しいカタチ
js-ctypes - ネイティブコードを呼び出す新しいカタチ
 
動的なILの生成と編集
動的なILの生成と編集動的なILの生成と編集
動的なILの生成と編集
 
gitを使って、レポジトリの一部抽出forkしてみました
gitを使って、レポジトリの一部抽出forkしてみましたgitを使って、レポジトリの一部抽出forkしてみました
gitを使って、レポジトリの一部抽出forkしてみました
 
Cookpad Summer Intern 2015 - Programming Paradigm
Cookpad Summer Intern 2015 - Programming ParadigmCookpad Summer Intern 2015 - Programming Paradigm
Cookpad Summer Intern 2015 - Programming Paradigm
 
とある制作会社の目次索引作成技法
とある制作会社の目次索引作成技法とある制作会社の目次索引作成技法
とある制作会社の目次索引作成技法
 
Lombok ハンズオン
Lombok ハンズオンLombok ハンズオン
Lombok ハンズオン
 
[Okta x Jamf合同新年会] Okta Workflowsによるノーコード業務改善 〜Jamf APIを使ってMac端末情報を自動収集してみよう〜
[Okta x Jamf合同新年会] Okta Workflowsによるノーコード業務改善 〜Jamf APIを使ってMac端末情報を自動収集してみよう〜[Okta x Jamf合同新年会] Okta Workflowsによるノーコード業務改善 〜Jamf APIを使ってMac端末情報を自動収集してみよう〜
[Okta x Jamf合同新年会] Okta Workflowsによるノーコード業務改善 〜Jamf APIを使ってMac端末情報を自動収集してみよう〜
 
Programming camp 2008, Codereading
Programming camp 2008, CodereadingProgramming camp 2008, Codereading
Programming camp 2008, Codereading
 
Angularを利用したシステム開発事例
Angularを利用したシステム開発事例Angularを利用したシステム開発事例
Angularを利用したシステム開発事例
 

Más de 株式会社MonotaRO Tech Team

Más de 株式会社MonotaRO Tech Team (20)

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

MonotaRO LT - ESLintの仕組み