- 投稿日:2020-10-24T21:30:16+09:00
React+TypeScriptでモダンな環境に入門してみる
業務ではJava+SpringBoot、jQuery等しか使ったことがないエンジニアです。
React+TypeScriptを学ぶ過程を記録として残していきます。
あとから来る人の参考の1つとしてハマったところも書いていければと。概要
この記事では、React+TypeScriptで開発するためのローカル環境を構築するところまでやります。
後々のことも考えて、anyenv+nodenvで環境をつくっていきます。
筆者の環境は以下に記載しておきます
- macOS Catalina 10.15.7
- node.js
- TypeScript
- React
anyenvとnodenvのインストール
JavaScript(TypeScript)のパッケージ管理システムとしてyarnを使うためにNode.jsをインストールします。今後、場合によってはバージョンの違うNode.jsを使う可能性もあるため、バージョンマネージャを使います。
今回は他の言語(pyenvなど)のパッケージマネージャもまとめて管理できるanyenvを使って、Node.jsのバージョンマネージャであるnodenvを入れていきます。// Homebrewを使ってanyenvをインストールする brew install anyenv // ご自身が使っているシェルに合わせて設定ファイルにanyenvの設定するコマンドを追記する echo 'eval "$(anyenv init -)"' >> ~/.bash_profile // 起動中のシェルに再ログインしてanyenvを有効化する // exec・・・現在のプロセスを上書きしてコマンドを実行 // $SHELL・・・現在起動中のシェルのパス // -l・・・bashのオプション。ログインを意味する exec $SHELL -l // anyenvコマンドでnodenvをインストールする anyenv install nodenv // シェルを再起動 exec $SHELL -lReactプロジェクトを作成
プロジェクトを作成したいディレクトリにて下記コマンドを実行します。
// npx・・・npmパッケージで提供されているコマンドを実行するコマンド // create-react-app・・・React用のテンプレートプロジェクトをいい感じにつくってくれるコマンド // --template typescript・・・TypeScriptでReactのプロジェクトを作成するオプション npx create-react-app <プロジェクト名> --template typescriptReactプロジェクトを起動
create-react-app
で作成したプロジェクトを起動します。
コマンドが正常に完了すると以下のようなメッセージが表示されるのでそのとおりに実施すればOKです。We suggest that you begin by typing: cd hello-world yarn start Happy hacking!参考
- 投稿日:2020-10-24T21:30:16+09:00
TypeScript+Reactでモダンな環境に入門してみる
業務ではJava+SpringBoot、jQuery等しか使ったことがないエンジニアです。
TypeScript+Reactを学ぶ過程を記録として残していきます。
あとから来る人の参考の1つとしてハマったところも書いていければと。概要
この記事では、TypeScript+Reactで開発するためのローカル環境を構築するところまでやります。
後々のことも考えて、anyenv+nodenvで環境をつくっていきます。
筆者の環境は以下に記載しておきます
- macOS Catalina 10.15.7
- node.js
- TypeScript
- React
anyenvとnodenvのインストール
JavaScript(TypeScript)のパッケージ管理システムとしてyarnを使うためにNode.jsをインストールします。今後、場合によってはバージョンの違うNode.jsを使う可能性もあるため、バージョンマネージャを使います。
今回は他の言語(pyenvなど)のパッケージマネージャもまとめて管理できるanyenvを使って、Node.jsのバージョンマネージャであるnodenvを入れていきます。// Homebrewを使ってanyenvをインストールする brew install anyenv // ご自身が使っているシェルに合わせて設定ファイルにanyenvの設定するコマンドを追記する echo 'eval "$(anyenv init -)"' >> ~/.bash_profile // 起動中のシェルに再ログインしてanyenvを有効化する // exec・・・現在のプロセスを上書きしてコマンドを実行 // $SHELL・・・現在起動中のシェルのパス // -l・・・bashのオプション。ログインを意味する exec $SHELL -l // anyenvコマンドでnodenvをインストールする anyenv install nodenv // シェルを再起動 exec $SHELL -lReactプロジェクトを作成
プロジェクトを作成したいディレクトリにて下記コマンドを実行します。
// npx・・・npmパッケージで提供されているコマンドを実行するコマンド // create-react-app・・・React用のテンプレートプロジェクトをいい感じにつくってくれるコマンド // --template typescript・・・TypeScriptでReactのプロジェクトを作成するオプション npx create-react-app <プロジェクト名> --template typescriptReactプロジェクトを起動
create-react-app
で作成したプロジェクトを起動します。
コマンドが正常に完了すると以下のようなメッセージが表示されるのでそのとおりに実施すればOKです。We suggest that you begin by typing: cd hello-world yarn start Happy hacking!参考
- 投稿日:2020-10-24T19:20:57+09:00
VSCode > Remote Containers > Reactの環境を作って、create-react-ap
環境
Mac:Catalina
docker: 19.03.13
docker desktop for mac
Dockerはインストール済みとする。環境準備
拡張機能である、Remote-Containersを入れる
VSCodeを起動
適当な加フォルダでVSCodeを開きます(中身はからっぽでOK)
開発コンテナ設定ファイルの作成
表示 > コマンドパレットを開く
Remote-Containers: Add
まで打ち込んだら表示される、Remote-Containers: Add Development Container Configuration Files...
を選択します。Show All Definitions...を選択します。
検索BOXに
node
と入力し、Node.js & Typescript
を選択します。
これで設定ファイルが追加されました。
React設定の追加
Dockerfile
Dockerfileの17行目あたりに
create-react-app
のインストールを追加するDockerfile# [Optional] Uncomment if you want to install more global node packages # RUN sudo -u node npm install -g <your-package-list -here> RUN sudo -u node npm install -g create-react-appdevcontainer.json
ポートフォワードの設定を行う。
23行目あたりのポートフォワードのコメントを外して3000と入力する。devcontainer.json// Use 'forwardPorts' to make a list of ports inside the container available locally. "forwardPorts": [3000],Dockerの有効化
コマンドパレットに表示された
Containers:Rebuild and Reopen in Container
を選択する。react app の作成と実行
作成
ターミナルにて以下を打ち込む
npx create-react-app my-appしばらく待つとreact appの雛形が作成される。
(初回はかなり待たされる)Happy hacking!が表示されたら完了
実行
環境作成が完了したら、ターミナルにて以下を打ち込む
cd my-app npm startしばらく待つと起動します。
ブラウザにて http://localhost:3000 にアクセス!
以下の画面が表示されればOK
Happy hacking!
おまけ
Terminalに
warning: setlocale: LC_CTYPE: cannot change locale (ja_JP.UTF-8)
と表示されるときはDockerfileに以下を追加することで解決します
DockerfileRUN localedef -f UTF-8 -i ja_JP ja_JP.UTF-8参考
How to use Visual Studio Code Remote Containers to develop Microsoft Teams apps · Garry Trinder
- 投稿日:2020-10-24T18:25:28+09:00
React 機能メモ(自分用)
- 投稿日:2020-10-24T17:46:52+09:00
デザイナーが1人でGatsbyを使ってサイトを作ったよ #2
この記事について
内容を一言でまとめると
- 前回の記事の続きで、具体的なコンテンツを作成するまでの流れ
こんな人が読んでくれたら嬉しい
- ポートフォリオサイトを作成しようと思っている方
- かつ、制作物のページ更新は出来るだけ簡単に済ませたい方
作ったサイト
運用の方法
- 所定のフォルダに、任意の名前のフォルダを作成する
- そのフォルダ内にMarkdownファイルを保存する
- フォルダ名をslugとしたページが作成される
作成の手順
プラグインを導入する
プラグイン名 説明 gatsby-transformer-remark MarkdownファイルをHTMLに変換してくれるプラグイン。 gatsby-remark-images Markdown内で使った画像も普段のGatbsyのように最適化を施した上でビルド出来るようにしてくれるプラグイン。 shellyarn add gatsby-source-filesystem gatsby-transformer-remark gatsby-remark-images gatsby-plugin-sharp今回の記事において重要なのは
gatsby-transformer-remark
とgatsby-remark-images
です。
Gatsbyを使っているならgatsby-source-filesystem
とgatsby-plugin-sharp
は導入済の場合も多いと思いましたが、念のため記載。gastby-config.jsplugins: [ { resolve: `gatsby-source-filesystem`, options: { name: `markdown-pages`, path: `${__dirname}/src/markdown-pages`, }, }, { resolve: `gatsby-transformer-remark`, options: { plugins: [ { resolve: `gatsby-remark-images`, options: { maxWidth: 680, linkImagesToOriginal: false, quality: 80, withWebp: true, }, }, ], }, }, ]
resolve: gatsby-source-filesystem
の部分は、Markdownファイル専用のフォルダを作っておいた方が便利なので作成し、filesystemで扱えるようにここで定義しています。
resolve: gatsby-transformer-remark
は、オプションとしてgatsby-remark-images
を使うので入れ子になっています。
自分は画像をクリックした際にオリジナルへリンクしてもしょうがないなと思ったのでfalseを選んだり、webpが使えるようにしたかったのでtrueを選択したりしています。テンプレートを作成する
src/templates/template.jsimport React from 'react' import { graphql } from 'gatsby' import Img from 'gatsby-image' // 本来このあたりにスタイリングのためのコードがあるものの、省略 export default function Template({ data }) { const post = data.markdownRemark const featuredImageFluid = post.frontmatter.featuredImage.childImageSharp.fluid return ( <> // 本来レイアウトのためのコンポーネントやコードがあるものの、省略 <Img fluid={featuredImageFluid} alt='' /> <h1>{post.frontmatter.title}</h1> <article dangerouslySetInnerHTML={{ __html: post.html }} /> </> ) } export const pageQuery = graphql` query($slug: String!) { markdownRemark(fields: { slug: { eq: $slug } }) { html frontmatter { title featuredImage { childImageSharp { fluid(maxWidth: 800) { ...GatsbyImageSharpFluid } } } } } } `GraphQLでhtmlやfeaturedImageの情報を取得して、returnの中であれこれ展開します。
今回で一番大切になるのはdangerouslySetInnerHTML={{ __html: post.html }}
の部分。
ここにMarkdown内のコンテンツが注入されます。
createPage
APIを利用してページを生成するgatsby-node.jsconst path = require(`path`) exports.createPages = async ({ actions, graphql }) => { const { createPage, createRedirect } = actions const template = path.resolve(`src/templates/template.js`) const result = await graphql(` { allMarkdownRemark( sort: { order: DESC, fields: [frontmatter___date] } limit: 1000 ) { edges { node { fields { slug } } } } } `) result.data.allMarkdownRemark.edges.forEach(({ node }) => { createPage({ path: node.fields.slug, component: template, context: { slug: node.fields.slug }, }) }) } const { createFilePath } = require(`gatsby-source-filesystem`) exports.onCreateNode = ({ node, getNode, actions }) => { const { createNodeField } = actions if (node.internal.type === `MarkdownRemark`) { const slug = createFilePath({ node, getNode, basePath: `markdown-pages` }) createNodeField({ node, name: `slug`, value: slug, }) } }このページで紹介されているやり方だとMarkdown内に毎度slugのために何かしら指定することになり……面倒でした。
というわけでcreateNodeField
という関数でもって、src/markdown-pages
の中にあるフォルダ名をslugに出来るようにしています。あとは
result.data.allMarkdownRemark.edges.forEach(({ node })
の中でMarkdownからページを作成する運びです。Markdownを保存する
ここまで来たら
src/markdown-pages
内にフォルダを作ってMarkdownファイルを保存すればどんどんページが作成されます。
もちろんリリースした後でもMarkdownを編集すればサイトそのものを更新できます。まとめ
せっかくサイトを作っても更新が面倒だと滞りがちです。そうなってしまっては勿体ないですよね。
出来るだけ簡単に更新出来るようにして、日々触れるサイトになると良いよねと思います。
ちなみに自分の制作物のページ更新は若干滞っています……。頑張らないとな……。
- 投稿日:2020-10-24T00:51:35+09:00
ReactでPropsからHタグのレベルを変える。
?のようにPropsからHタグのレベルを制御したいとします。
例<H level={1} /> // = <h1 /> <H level={2} /> // = <h2 /> <H level={3} /> // = <h3 /> <H level={4} /> // = <h4 /> <H level={5} /> // = <h5 /> <H level={6} /> // = <h6 />React.ElementTypeにキャストすることで文字列からHTMLの標準タグを作ることができます。
解決法function H(props) { const Header = `h${props.level}` as React.ElementType; return <Header />; }