Open kurodakazumichi opened 6 years ago
reboot.css
を入れてみた。2018年11月 reboot.css
なるものが良いらしいのでreboot.css
を採用。
root/src/assets/styles/reboot.css
に普通のcssを配置webpack
のcss-loader
とstyle-loader
を使って.js
内でimport
して利用。webpack.config.js
:
rules: [
/**
* .cssのローダーを設定
* 1. css-loaderでcssをjs moduleに変換
* 2. style-loaderでブラウザでstyleとして使えるようにロード
*/
{
test: /\.css$/,
use: [
'style-loader',
'css-loader'
]
},
]
reboot.cssもnpmで管理されてるなら、npmで使いたいところ
yarn add -D @fortawesome/fontawesome-free
.jsファイル
でimport
して使う
import '@fortawesome/fontawesome-free/css/all.css';
all.css
のなかで各種フォントファイル(ttf,wof,svgなどなど)のでwebpack
のfile-loader
を設定するwebpack.config.js
/**
* フォントファイルのローダーを設定
*/
{
test: /\.(woff|woff2|eot|ttf|otf|svg)$/,
loader: 'file-loader'
}
IE9を以下を捨てるならwoff
だけ使っておけばいいと思う。
マルチブラウザ、かつ古いブラウザにも対応するなら各種ブラウザが認識できるフォントファイルを全部ぶち込む必要があるが、その分ページサイズは増える。
woff
なら主要でモダンなブラウザは基本対応してるので、古いものは切り捨てていこう。
WOFF (Web Open Font Format) は、Mozilla が Type Supply や LettError、他の組織と提携して開発した新しい Web フォント形式です。これは、TrueType および OpenType, Open Font Format に使用されているテーブルベースの sfnt 構造と同じ圧縮されたバージョンを使用しています。WOFF には、これにメタデータと個人利用のためのデータ構造が追加されており、作成者とベンダーがライセンス情報を書き込むことができる予約フィールドも含まれています。
WOFF の使用には 3 つの利点があります:
フォントデータが圧縮されているため、サイトで WOFF を使用すると、無圧縮の TrueType や OpenType ファイルの使用と比べて帯域を抑えることができ、読み込み時間も短縮されます。 自社の TrueType や OpenType 形式のフォントが Web 上で使用されること許可したくない多くのフォントベンダーは、WOFF 形式のフォントなら使用を許可できるでしょう。これは、サイトのデザイナーに対してフォントの可用性を高めることになります。 プロプライエタリなブラウザベンダーもフリーソフトウェアのブラウザベンダーも、WOFF 形式を好んでいます。つまり、他の既存のフォント形式と異なり、WOFF 形式のフォントが、Web のための真にユニバーサルで相互運用が可能なフォント形式になる可能性があります。 WOFF と WOFF2 という、2 つのバージョンの WOFF があります。これらの主な違いは、使用する圧縮アルゴリズムです。@font-face では format 記述子で、それぞれ 'woff' と 'woff2' で識別されます。
yarn add -D node-sass sass-loader
node-sass
はnode.js
上で動作するsasssass-loader
はwebpack
のloader
でsass
をcssモジュール
に変換するwebpack.config.js
/**
* SASSのローダーを設定
*/
{
test: /\.scss$/,
use: ['style-loader', 'css-loader', 'sass-loader']
},
yarn add mobx mobx-react
yarn add -D @babel/plugin-proposal-class-properties @babel/plugin-proposal-decorators
.babelrc
:
"plugins": [
["@babel/plugin-proposal-decorators", {"legacy": true}],
["@babel/plugin-proposal-class-properties", {"loose": true}]
]
mobx
のdecorator
構文を使うためにbabel
のplugin
を追加している。
decorators
をlegacy"モードで使用する場合、
class-properies`が必要になる。(公式情報)
plugins
を書く順番も先にdecorators
を書かないといけない。(公式情報)
{legacy:true}
に関してはdecorator
は現在Stage2(Draft)の段階にあるが
Stage1(Idea)のモードで動作させるという指定になるようだ。
https://babeljs.io/docs/en/babel-plugin-proposal-class-properties
これは以下のような普通のクラスプロパティの書き方を使えるようにするプラグイン
class Bork {
a = "hoge";
b = () => {}
static c = "bar";
static f = function() {}
}
https://babeljs.io/docs/en/babel-plugin-proposal-decorators
これは@anotation
構文を使えるようにするプラグイン
@annotation
class MyClass { }
function annotation(target) {
target.annotated = true;
}
yarn add -D typescript awesome-typescript-loader
yarn add -D @type/react @type/react-dom
tsconfig.json
{
"compilerOptions": {
"baseUrl": "./",
"paths": {
"~/*": ["src/*"],
},
"rootDirs": ["src"],
"outDir": "dist",
"sourceMap": true,
"module": "commonjs",
"target": "es5",
"lib": ["es5", "es6", "es7", "es2018", "dom"],
"jsx": "react",
"allowJs": true,
"noImplicitAny": true,
"removeComments": true,
"preserveConstEnums": true,
"experimentalDecorators": true
},
"include": ["./src/**/*"],
"exclude": [
"dist",
"node_modules"
]
}
webpack.config.js
resolve: {
alias: {
'~': path.resolve(__dirname, 'src')
},
yarn add react-router-dom
yarn add -D @types/react-router-dom
react-router-dom
はURLでコンポーネントを切り替えるための仕組みを提供するパッケージ
typescript
を使っているので型定義ファイルもいれておく。
https://qiita.com/junara/items/a4a98c27dc23fd53ebb9 ここが参考になる。
Reactを使ったページ遷移はサーバーにアクセスしに行くわけではなく JavaScriptだけで表示の内容を切り替えている。
react-router-dom
はブラウザのhistoryを使ってページ遷移をしている。
実際にサーバーにアクセスしに行っているわけではないというところが混乱した。
またhistoryを操作してURLを変えているが、サーバーにはindex.htmlしかないわけで 本来404を返すところはindex.htmlへフォールバックするという設定をサーバーはしないといけない。
https://qiita.com/ConquestArrow/items/eb4a0dfb13497be4d6a3 使い方はここが参考になる。
基本はJSDoc風にコメントを書いておき、コマンド一発でドキュメントが作られる。
yarn add classnames
yarn add -D @types/classnames
yarn add -D @storybook/react
package.json
に下記を追加:
{
"scripts": {
"storybook": "start-storybook -p 9001 -c .storybook"
}
}
カレントディレクトリに.storybook
フォルダを作成
設定ファイル.storybook/config.js
を作成:
import { configure } from '@storybook/react';
function loadStories() { require('../stories/index.js'); // You can require as many stories as you need. }
configure(loadStories, module);
- `../stories/index.js`を作成:
```js
import React from 'react';
import { storiesOf } from '@storybook/react';
import { Button } from '@storybook/react/demo';
storiesOf('Button', module)
.add('with text', () => <Button>Hello Button</Button>)
.add('with some emoji', () => (
<Button>
<span role="img" aria-label="so cool">
😀 😎 👍 💯
</span>
</Button>
));
npm run storybook
で起動TypeScriptとawesome-ts-loaderはすでに入れてるのでそこから
yarn add -D @types/storybook__react
yarn add -D @storybook/addon-info react-docgen-typescript-webpack-plugin
storybook
のwebpack.config.js
を上書き
const path = require('path');
const TSDocgenPlugin = require('react-docgen-typescript-webpack-plugin');
module.exports = (baseConfig, env, config) => {
config.module.rules.push({
test: /\.(ts|tsx)$/,
loader: require.resolve('awesome-typescript-loader'),
});
config.plugins.push(new TSDocgenPlugin()); // optional
config.resolve.extensions.push('.ts', '.tsx');
return config;
};
.storybook/tsconfig.json
{
"compilerOptions": {
"outDir": "build/lib",
"module": "commonjs",
"target": "es5",
"lib": ["es5", "es6", "es7", "es2017", "dom"],
"sourceMap": true,
"allowJs": false,
"jsx": "react",
"moduleResolution": "node",
"rootDirs": ["src", "stories"],
"baseUrl": "src",
"forceConsistentCasingInFileNames": true,
"noImplicitReturns": true,
"noImplicitThis": true,
"noImplicitAny": true,
"strictNullChecks": true,
"suppressImplicitAnyIndexErrors": true,
"noUnusedLocals": true,
"declaration": true,
"allowSyntheticDefaultImports": true,
"experimentalDecorators": true,
"emitDecoratorMetadata": true
},
"include": ["src/**/*"],
"exclude": ["node_modules", "build", "scripts"]
}
storybook
を立ち上げっぱなしだと設定が反映されず、ん?ってなるので設定変えたらrerunした方が良い。これでいける。
sass
使ってるとさらにsass
の設定も追記が必要.storybook/webpack.config.js
に追記:
module.exports = (baseConfig, env, config) => {
// Extend defaultConfig as you need.
// Make whatever fine-grained changes you need
defaultConfig.module.rules.push({
test: /\.scss$/,
loaders: ["style-loader", "css-loader", "sass-loader"],
});
}
propsを動的に操作できるknobs
その他デフォルトっぽいの
yarn add -D @storybook/addons @storybook/addon-actions @storybook/addon-links @storybook/addon-notes
.storybook/addons.js
を作成:
import '@storybook/addon-knobs/register';
React + Mobxでのフロントエンド開発環境構築
カリキュラム
思ったこと
node.jsで作ったjavascirptをブラウザで動かすためには一手間必要になるんだけど なんとなくjavascirpt=ブラウザで動かせると思って取りかかるとハマる。
確かに言語はjavascriptだけど、PC上で動作するものをブラウザ上で動かそうってなれば 動作環境違うんだからそれなりに手間はかかるんだよって事。
それをサクッと解決してくれるのが
webpack
なので、webpack
は結構重要だなーと思う。