DEPRECATED (2019.07.06)
古くからの「HTMLとスタイルは別ファイルに分割すべし」との考えに従ってスタイルはコンポーネント毎に専用のCSSを用意してcss-loaderで読み込ませていたが、Css in JSの方が有用と判断したため本記事は有用性を失っている。
概要
開発時に、CSSファイルで定義したスタイルがJavascript実行より遅れて適用されて意図しない動作をした。以下、原因を調査した際の覚書。
環境
Reactプロジェクトをcreate-react-app
で作成後、yarn eject
を実行した。得られた環境は以下の通り。
- React: 16.5.2
- webpack: 4.19.1
ソースコード
import React, { Component } from 'react';
import logo from './logo.svg';
import './App.css';
class App extends Component {
componentDidMount() {
const logo = document.querySelector('.App-logo');
const logoStyle = window.getComputedStyle(logo);
const logoHeight = logoStyle.getPropertyValue('height');
console.log(logoHeight);
}
render() {
return (
<div className="App">
<header className="App-header">
<img src={logo} className="App-logo" alt="logo" />
<p>
Edit <code>src/App.js</code> and save to reload.
</p>
<a
className="App-link"
href="https://reactjs.org"
target="_blank"
rel="noopener noreferrer"
>
Learn React
</a>
</header>
</div>
);
}
}
export default App;
OKパターン
yarn start
にて開発サーバーを立ち上げると、.App-logo
のheight
が計算され、コンソールに281.594px
と出力される。また、ChromeのDeveloper ToolsでElementsを見ると、スタイルはheadタグ内に<style>
として記述されている。
NGパターン
webpackの設定にて、css-loaderでsourceMap
が有効になっていると、スタイルが適用される前にスクリプトが実行されてしまい、期待と異なる結果になる。
require.resolve('style-loader'),
{
loader: require.resolve('css-loader'),
- options: cssOptions,
+ options: Object.assign(cssOptions, {
+ sourceMap: true,
+ }),
},
yarn start
にて開発サーバーを立ち上げると、.App-logo
のheight
が計算される時点でスタイルは適用されておらず、コンソールには0px
と出力される。また、ChromeのDeveloper ToolsでElementsを見ると、スタイルはheadタグ内に<link>
として記述されている。外部ファイルを読み込む形になっており、スクリプト実行時には読み込みが完了してないため、期待と異なる結果になる。