No.
2022-01-29
  • Jan
  • Feb
  • Mar
  • Apr
  • May
  • Jun
  • Jul
  • Aug
  • Sep
  • Oct
  • Nov
  • Dec
  • Sun
  • Mon
  • Tue
  • Wed
  • Thu
  • Fri
  • Sat
  • 27
  • 28
  • 29
  • 30
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

やったこと

Reactの環境構築の続き!

Issue Templateについて

Issueのtemplateを作成したい場合には、二つの方法がある。
一つはSettingsから設定する方法
もう一つは.github/workflows/ISSYE_TEMPLATEに設定する方法

設定する内容:

  1. バグの詳細
  2. 報告者が想定する原因
  3. 発生状況を再現
  4. 端末情報
  5. 二次障害の懸念 を記載する

リポジトリ用に Issue テンプレートを設定する

ESLintについて

ESLint設定しておきながらあんまり知らないな〜と思ったので調べてみる
今回、”eslint:recommended”を指定したが実際中で何をチェックしているのか知らなかった

“eslint:recommended”は何をチェックしているのか

この記事を参照 ESLintの推奨設定(eslint:recommended)のチェック内容
List of available rules - ESLint - Pluggable JavaScript linter

  1. no-cond-assign
    if, for, while, and do…whileの条件式で代入演算子(=など)を許可しない。
    比較演算子(==,===など)のタイプミスで代入演算子が入力された箇所などを見つけてくれる

  2. no-console
    consoleオブジェクトのメソッド(console.log等)の記述を許可しない。
    公開時の消し忘れを防いでくれる。

  3. no-constant-condition
    if, for, while, and do…whileや三項演算子(?:)の条件式を定数式(リテラルなど)にすることを許可しない。
    必ず実行されたり、一度も実行されなかったりするなど、条件文として不適切な記述が無いかチェックしてくれる

  4. no-control-regex
    正規表現内でASCII制御文字の使用を許可しない。

  5. no-debugger
    開発時のブレークポイントの設定などに使用するdebuggerステートメントの記述を許可しない。
    公開時の消し忘れを防いでくれる。

  6. no-dupe-args
    関数宣言や関数式の引数の重複を許可しない。

  7. no-dupe-keys
    オブジェクトリテラルでキーの重複を許可しない。

  8. no-duplicate-case
    switch文でcaseの重複を許可しない。

  9. no-empty-character-class
    正規表現で空の文字クラス([])を許可しない。

  10. no-empty
    空のブロックを許可しない。

  11. no-ex-assign
    try…catch 文でcatchブロック内で例外オブジェクトを上書きすることを許可しない。
    try {
    // code
    } catch (e) {
    e = 10; // 例外オブジェクトを上書き
    }
    
  12. no-extra-boolean-cast
    不必要なboolean型の型変換を許可しない。

  13. no-extra-semi
    不必要なセミコロンを許可しない。

  14. no-func-assign
    関数宣言として記述された関数への上書きを許可しない。

  15. no-inner-declarations
    ネストブロック内での変数や関数宣言を許可しない。 (デフォルトでは関数宣言のみ)
if (test) {
    function doSomething() { }
}
 
function doSomethingElse() {
    if (test) {
        function doAnotherThing() { }
    }
}
  1. no-invalid-regexp
    RegExp コンストラクタ内で無効な正規表現文字列を許可しない。

  2. no-irregular-whitespace
    Unicodeの特殊な空白文字を許可しない。

  3. no-obj-calls
    グローバルオブジェクトを関数として呼び出すことを許可しない。

  4. no-regex-spaces
    正規表現文字列の中で2文字以上の連続した空白を許可しない。

  5. no-sparse-arrays
    空のスロットを含む配列を許可しない。
    連続したカンマはカンマのタイプミスである可能性がある。

一通り見たけど、割と当たり前な部分をチェックしてくれてるんだな〜〜

“react/recommended”は何をチェックしているのか?

eslint-plugin-react

  1. react/display-name
    Prevent missing displayName in a React component definition
    (Reactコンポーネント定義でdisplayNameが欠落しないようにする)
    *これはクラスコンポーネントの際に必要になるため割愛

  2. react/no-children-prop
    Prevent passing of children as props.
    (childrenをpropsとして渡すことを禁止する)

incorrect

<div children='Children' />
<MyComponent children={<AnotherComponent />} />
<MyComponent children={['Child 1', 'Child 2']} />
React.createElement("div", { children: 'Children' })

correct

<div>Children</div>
<MyComponent>Children</MyComponent>
<MyComponent>
  <span>Child 1</span>
  <span>Child 2</span>
</MyComponent>
React.createElement("div", {}, 'Children')
React.createElement("div", 'Child 1', 'Child 2')
  1. react/no-danger-with-children
    Report when a DOM element is using both children and dangerouslySetInnerHTML
    (DOM 要素が children と dangerouslySetInnerHTML の両方を使用している場合reportする)

dangerouslySetInnerHTMLとは

マークダウンエディタを作りたい場合など、ブラウザ上で記述したHTMLのプレビューを作りたいときに使う
しかし、XSSになる危険性があるのであまり使う機会は少ないかも

参考記事 ReactのdangerouslySetInnerHTML使ってみた

  1. react/no-deprecated (非推奨のメソッドを使用しないようにする)
    incorrect
    // old lifecycles (since React 16.9)
    componentWillMount() { }
    componentWillReceiveProps() { }
    componentWillUpdate() { }
    

    correct

    UNSAFE_componentWillMount() { }
    UNSAFE_componentWillReceiveProps() { }
    UNSAFE_componentWillUpdate() { }
    
  2. react/no-direct-mutation-state
    Prevent direct mutation of this.state
    (this.stateの直接的な変更を防ぐ)

  3. react/no-find-dom-node
    Prevent usage of findDOMNode
    (findDOMNodeの使用を防ぐ)

  4. react/no-is-mounted
    Prevent usage of isMounted
    (isMountedの使用を防ぐ)

  5. react/no-render-return-value
    Prevent usage of the return value of React.render (React.renderの戻り値を使用しないようにする)

  6. react/no-string-refs
    Prevent string definitions for references and prevent referencing this.refs
    (リファレンスに文字列を定義し、this.refs を参照できないようにする。)

inccorect

var component = this.refs.hello;
  1. react/no-unescaped-entities
    Detect unescaped HTML entities, which might represent malformed tags
    (不正なタグを表すかもしれない、エスケープされていないHTMLエンティティを検出する)

example

<MyComponent>{'Text'}}</MyComponent>
  1. react/no-unknown-property
    Prevent usage of unknown DOM property
    (unknownなDOMプロパティの使用を防止する)

incorrect

var Hello = <div class="hello">Hello World</div>;

correct

var Hello = <div className="hello">Hello World</div>;
  1. react/prop-types
    Prevent missing props validation in a React component definition
    (Reactコンポーネント定義でpropsの検証漏れを防止する)

example

interface Props {
  age: number
}
function Hello({ name }: Props) {
  return <div>Hello {name}</div>;
  // 'name' type is missing in props validation
}
  1. react/react-in-jsx-scope
    Prevent missing React when using JSX
    (JSX使用時にReactが欠落するのを防ぐ)

correct example

import React from 'react';
var Hello = <div>Hello {this.props.name}</div>;
  1. react/require-render-return
    Enforce ES5 or ES6 class for returning value in render function
    (レンダー関数で値を返すためにES5またはES6クラスを強制する)
    これもクラスコンポーネントの話なので割愛

ここから下はJSXについて

  1. react/jsx-key
    Report missing key props in iterators/collection literals
    (key propsの欠落を検知する)

icorrect example

data.map(x => <Hello>{x}</Hello>);

correct

data.map((x, i) => <Hello key={i}>{x}</Hello>);
  1. react/jsx-no-comment-textnodes
    Comments inside children section of tag should be placed inside braces
    (コメントがテキストノードとして挿入されないようにする)

incorrect example

return (
  <div>// empty div</div>
);

correct

return <div>{/* empty div */}</div>;
  1. react/jsx-no-duplicate-props
    Prevent duplicate properties in JSX
    (JSXでのプロパティの重複を防ぐ)

example

<Hello name="John" name="John" />;
  1. react/jsx-no-target-blank
    Prevent usage of unsafe target='_blank'
    (安全でない target='_blank' () の使用を防止する。)

安全でないtarget='_blank'って何?と思いました

target="_blank"の何が怖いのか

新しく開かれたウィンドウでJavaScriptのwindow.openerを使用し、親ウィンドウ(リンク元)を操作できてしまう点
以下のようなたった1行があるだけで、target="_blank"で新しく開かれたウィンドウから親ウィンドウを「hoge.com」へ遷移させることもできてしまう

window.opener.location="https://www.adc.com/"

この対策としてはrel="noopener"を設定することで解決できる

  1. react/jsx-no-undef
    Disallow undeclared variables in JSX
    (JSXで宣言されていない変数を禁止する)

  2. react/jsx-uses-react
    Prevent React to be marked as unused
    (Reactがunusedとされないようにする)

incorrect example

var React = require('react');
// nothing to do with React
  1. react/jsx-uses-vars
    Prevent variables used in JSX to be marked as unused
    (JSXで使用される変数が未使用とマークされないようにする。)

以上がeslint-plugin-reactのrecommendされているLintの内容