Skip to content

Commit

Permalink
Update
Browse files Browse the repository at this point in the history
  • Loading branch information
mizchi committed May 27, 2020
1 parent 73878b1 commit fc5b53c
Show file tree
Hide file tree
Showing 12 changed files with 1,273 additions and 0 deletions.
3 changes: 3 additions & 0 deletions .vscode/setting.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"editor.wordWrap": "on"
}
98 changes: 98 additions & 0 deletions docs/202005271609-react-app-context.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
---
title: React Context を用いた簡易 Flux
created: 1590563363484
tags: []
---

## 課題

- redux を引っ張り出すと大仰になる。Context 下に共有ステートを持ってそこに setState できるだけでよい。
- なので、次の 2 つを用意する
- 現在の state を参照する `const appState = useAppState()`
- 現在の state を更新する `const setAppState = useSetAppState()`
- `React.useState()` と違って分割している理由は、主にパフォーマンス上の理由
- 大域な参照なので、可能な限り参照したくない
- `setState()` の API は `(prevState: State) => State` も取れるので、状態更新用途に限ってはそもそも `useAppState()` せずに済むことが多い
- でも毎回書いてるけどボイラープレート感強い上に忘れるのでここにメモする

## 毎回書いてるボイラープレート

```tsx
// src/contexts/AppStateContext.tsx
import React, { Dispatch, SetStateAction, useContext, useState } from "react";

export type AppState = {
value: number;
};

const initialState = {
value: 0,
};

const AppStateContext = React.createContext<AppState>(initialState);
const SetAppStateContext = React.createContext<
Dispatch<SetStateAction<AppState>>
>(() => {});

export function useAppState() {
return useContext(AppStateContext);
}
export function useSetAppState() {
return useContext(SetAppStateContext);
}

export function AppStateProvider(props: {
initialState?: AppState;
children: React.ReactNode;
}) {
const [state, setState] = useState<AppState>(
props.initialState ?? initialState
);
return (
<AppStateContext.Provider value={state}>
<SetAppStateContext.Provider value={setState}>
{props.children}
</SetAppStateContext.Provider>
</AppStateContext.Provider>
);
}
```

## 使い方

```tsx
import React from "react";
import ReactDOM from "react-dom";
import {
AppStateProvider,
useAppState,
useSetAppState,
} from "./contexts/AppStateContext";

function Counter() {
const state = useAppState();
const setAppState = useSetAppState();
return (
<div>
{state.value}
<button
onClick={() => {
setAppState((s) => ({ value: s.value + 1 }));
}}
>
++
</button>
</div>
);
}

function App() {
return (
<AppStateProvider>
<Counter />
</AppStateProvider>
);
}

ReactDOM.render(<App />, document.querySelector("#root"));
```
48 changes: 48 additions & 0 deletions docs_wip/202005200249-engineer-career-pattern.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
---
title: エンジニアになった人のパターン
created: 1589910599048
tags: []
---

## きっかけ系

- 大学の授業で興味を持った
- wordpress のカスタマイズで php
- CGI ゲームの改造のために perl
- ブログのカスタマイズで HTML / CSS
- メディアアートをやってみたくて Flash
- メディアアートをやってみたくて Processing

## 日常効率系

- Excel VBA で効率化
- ブラウザ拡張を作りたかった

## ゲーム系

- ゲームを作りたくて Unity
- ゲームを作りたくて HTML5 Canvas
- RPG ツクールでは満足できなくて C#

## 性欲駆動系

- アダルトサイトのクローラを作りたかった
- エロサイトの広告にイライラしてブラウザ拡張で消すために勉強
- エロサイトの広告にイライラして作る側になった

## 不可避系

- ホームページ時代から
- 研究のツールを改造するために覚える羽目になった
- たまたま得意でたまたまコスパよく稼げたので、

## アングラ系

- 大規模 FTP ファイル交換サーバーの運用
- ラグナロクオンラインの BOT ファームの運用

## 傾向

最近ほど真っ当にアカデミックで勉強した人が多く、昔ほど自学した人が多く感じる。(そもそも情報系の学部が少なかったのでパイがない)

自分の世代はちょうど中間ぐらいで、
24 changes: 24 additions & 0 deletions docs_wip/202005212041-javascript-for-starter.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
---
title: javascript-for-starter
created: 1590061300128
tags: []
---

import Doc0 from "../fragments/nextjs/00.mdx";
import Doc1 from "../fragments/nextjs/01.mdx";
import Doc2 from "../fragments/nextjs/02.mdx";
import Doc3 from "../fragments/nextjs/03.mdx";
import Doc4 from "../fragments/nextjs/04.mdx";
import Doc5 from "../fragments/nextjs/05.mdx";

<Doc0 />

<Doc1 />

<Doc2 />

<Doc3 />

<Doc4 />

<Doc5 />
61 changes: 61 additions & 0 deletions fragments/nextjs/00.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
このドキュメントは Rails ガイド、

昨今、プログラミングスクールで教えられているカリキュラムを見ると、 HTML/CSS/JavaScript の次が Rails という展開が多く、

- Node.js エコシステムのキャッチアップのし辛さ
- Rails ガイドの完成度

個人的には next.js の生産性は眼を見張るものがあると思っているのですが、

もちろん、 Rails と Next.js はカバー範囲が微妙に違うので比較できる対象ではありません。 ただし、

---

# はじめに

## この本を読むと何がわかるようになるか

本書のゴールは、 node.js によるフロントエンドツールチェインを理解し、TypeScript を用いて React / Next.js のアプリケーションが開発できるようになることです。また、モダンなフロントエンド / Node.js がどういうものかを紹介するという目的があります。

第一部では、 next.js の構成要素を分解しながら、モダンなフロントエンドツールチェインについて学びます。

第二部では、第一部で学んだフロントエンド / Node.js の知識を前提に、実践的な next.js。

Next.js の開発にゴールを設定する意図としては、 Next.js 自体がフロントエンド技術と Node.js の複合的なアプリケーション開発フレームワークです。個別の機能を理解せずに使うことも可能ですが、最小の環境からスタートして、ボトムアップに個別の要素を理解することで、Node.js / フロントエンドへのエコシステムの理解が進むことを期待しています。

また、 next.js 上で React を TypeScript を使って記述していきます。これは HTML / DOM というものの意味論とコンポーネント概念、そして JavaScript 処理系そのものへの理解と洞察が身につくはずです。

本書では、next.js のミニマムな環境からスタートして、TypeScript / Webpack / React / Node.js と段階的に理解を深めながら、 next.js が裏側でやっていることを理解できるようになるのが目的です。なので、この本は next.js を最速で使えるようになる本ではありません。最速で使うだけなら、公式ドキュメントの GETTING STARTED を読んください。

next.js の内部要素を個別に分解しながら、フロントエンドと node.js というものへの理解を深めることを目的とします。

## 本書のターゲット

- 言語としての JavaScript は知っているが、 node や npm を使い方に詳しくない人
- フロントエンドツールチェインに詳しくなりたい人
- サーバーサイド node.js として、 Web Application Framework というものを触ってみたい人
- next.js に詳しくなりたい人

## 前提

本書では ES2019 と呼ばれる仕様をターゲットにします。これは tc39(JavaScript の仕様を決める委員会) の定める、2019 年度に勧告された仕様のことです。この仕様は、Safari / Chrome / Firefox などのブラウザで問題なく動作します。Internet Exproler 11 では動作しませんが、この本を読み終わった頃には、ES2019 を ES5 と呼ばれる水準(IE がサポート)に変換することも可能になるはずです。

ES2019, EcmaScript 2019 Edition, これはつまり、EcmaScript ≒ JavaScript は毎年、文法や機能が追加される言語ということです。毎年変化する言語を学ぶ必要はあるのか?と思う人がいるかも知れません。安心してください。今書いたコードが動かなくことは、セキュリティ問題が発覚したなどの稀な例外()を除いて、とても稀です。「今書いたコードが将来動くこと」を後方互換性といい、JavaScript はこの後方互換性を守ることに、とても注意が払われている言語です。

## この本で書かないこと

- JavaScript の基本的な文法についての解説: [JavaScript Primer \- 迷わないための入門書 \#jsprimer](https://jsprimer.net/) を参照してください
- CSS のコーディング: 本書で解説するのは最小限です。
- データベース: next.js の発展形として、blitz を用いたアプリケーションの解説をしますが、データベースそのものは取り扱いません。

## 読み方

1 章はハンズオン風に next.js を vercel にデプロイして、動くものを少ない手数で作れる、という体験を重視しています。

2 ~ 5 章も同じく、写経で動かしながら、雰囲気を掴むことに注力しています。気になる場合は自分で改造してみてください。

6 章は 2 ~ 5 章 を前提に、実践的な next.js アプリケーションを実装することに注力します。

7 章は blitz というフレームワークを使いますが、まだ実験的なフレームワークなので、軽く紹介、という感じです。これは、 next.js に Rails を置き換えることを期待している人向けに紹介する、ということを意図しています。blitz 自体の開発の進捗や、同じコンセプトのフレームワークが出現した場合、変更したり削除する可能性もあります。

文法上、理解が追いつかないものがある場合、 [JavaScript Primer \- 迷わないための入門書 \#jsprimer](https://jsprimer.net/) を参考にしてください。
128 changes: 128 additions & 0 deletions fragments/nextjs/01.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
# 第 1 章: Hello, Next.js!

## インストールと環境構築

node/npm のインストール

[ダウンロード \| Node\.js](https://nodejs.org/ja/download/)

vscode のインストール

[Visual Studio Code – コード エディター \| Microsoft Azure](https://azure.microsoft.com/ja-jp/products/visual-studio-code/)

## next.js プロジェクトの作成

TODO: Windows での環境構築の説明

ターミナルアプリを起動するか、 vscode 内で `Terminal > New Terminal` でターミナルを起動してください

```
$ mkdir hello-next-app
$ cd hello-next-app
$ npm init -y
# ライブラリのダウンロード
$ npm install next react react-dom --save
$ code . # vscode でプロジェクトを開く
$ code pages/index.js # エディタで開く
```

`pages/index.js` を次のように編集してください

```jsx
export default () => {
return <h1>Hello, Next</h1>;
};
```

ここでは、JavaScript の標準仕様に含まれない jsx という文法を使っています。詳しくは後で解説します。一旦は、ただの HTML を JavaScript の中で書くテンプレート記法だと思ってください。

この時点では、こういうファイル構成になっているはずです。

```
node_modules/
pages/
index.js
package-lock.json
package.json
```

## next サーバーの起動

```
$ npx next
```

ブラウザを開いて、 `http://localhost:3000/` を入力してください

次の画面が見えたら成功です。

TODO: 画像を貼る

## 解説

next.js は `pages/foo.js` というファイルを作成すると、 nqext は `/foo` という URL にそのファイルで `export default` されたコンポーネントを表示します。

今回作成した `pages/index.js` というファイル名は少し特別扱いされていて、`/index` もしくは `/` に対応します。

ついでに `/about` という URL のページを作ってみましょう。

```jsx
// pages/about.js
export default () => {
return (
<div>
<h1>About</h1>
<p>built by next.js</p>
</div>
);
};
```

これで、ブラウザで `http://localhost:3000/about` というページにアクセスできるようになります。

next.js の基本的な規約として `pages/` 以下に置いたファイルの、「ファイル名から拡張子を省いたもの」が、URL に対応します。

## vercel に公開してみよう

vercel は next.js の開発元が運営しているホスティングサービスです。vercel の提供する CLI ツールを使って、 next.js アプリケーションを vercel に公開してみましょう。

```
$ npm install -g vercel
$ vercel
# ユーザー登録/メールアドレス が求められるので入力
Vercel CLI 19.0.1
? Set up and deploy “~/plg/hello-next”? [Y/n] y
? Which scope do you want to deploy to? mizchi
? Link to existing project? [y/N] n
? What’s your project’s name? next-js-tutorial
? In which directory is your code located? ./
Auto-detected project settings (Next.js):
- Build Command: `npm run build` or `next build`
- Output Directory: Next.js default
- Development Command: next dev --port $PORT
? Want to override the settings? [y/N] N
🔗 Linked to mizchi/next-js-tutorial (created .vercel and added it to .gitignore)
🔍 Inspect: https://vercel.com/mizchi/next-js-tutorial/2yh1nfshh [3s]
✅ Production: https://next-js-tutorial-iota.now.sh [copied to clipboard] [31s]
📝 Deployed to production. Run `now --prod` to overwrite later (https://zeit.ink/2F).
💡 To change the domain or build command, go to https://zeit.co/mizchi/next-js-tutorial/settings
$ vercel --prod
Vercel CLI 19.0.1
🔍 Inspect: https://vercel.com/mizchi/next-js-tutorial/2yh1nfshh [2s]
✅ Production: https://next-js-tutorial-iota.now.sh [copied to clipboard] [4s]
```

これは自分の環境での実行例です。最後に表示された、 Production の URL を開いてみてください。(ここでは [https://next-js-tutorial-iota.now.sh/](https://next-js-tutorial-iota.now.sh/)) を開いてみてください。

この URL は誰でもアクセスすることができます。つまり、あなたが作ったウェブサイトが vercel 上で公開されました!おめでとうございます!

## 解説しなかったこと

- npm とはなにか package.json とはなにか
- next.js がどのようにうごいているのか
- React とはなにか
- JSX の文法
- vercel はどのように動いているのか
Loading

0 comments on commit fc5b53c

Please sign in to comment.