tamakipedia

フロントエンドエンジニア。Typescriptもう特訓中です。一日の振り返りや学んだことをちょっとずつ吐いています。

【JavaScript】default export と default import について

モジュールの読み込み時によく見かける {}
そうでないものの違いがわからなかったのでまとめてみました。
今回は default export と default import について。

import React from "react";
import { BookDescription } from "./BookDescription";

default export (名前なしexport)

  • 他のファイルで利用するために export を宣言する
  • アロー関数だとファイルの最後にexport default (関数名)を追記
  • 名前付き関数だと関数宣言時にexport defaultを追記
//アロー関数
const Title = (props) => {
  return <h2>{props.title}</h2>
}
export default Title;
//名前付き関数
export default function Title(props) {
  return <h2>{props.title}</h2>
}

default import (名前なしimport)

  • default export で指定した名前を import 時につける
  • default export でファイルごと読み込む時は ファイル名も同じ名前であることが多い
// Title.jsx
~~~
export default Title;
// App.jsx

import Title from ".Title";

おわり

この辺り意外とこんがらがっているので改めて整理できてよかったです。
明日は名前付きのexport import についての記事を書こうとおもいます。

おしまい

【typescript】interfaceは拡張ができる、typeは拡張ができない

今回は type と interface の違いについて。

# オブジェクトに型を定義する

アノテーションの部分をオブジェクト{}にすることで可能。
※型アノテーション = stringやbooleanのような注釈をつけて型を定義すること

//通常の型アノテーション
let name: string = "tamakipedia";

//オブジェクトの場合
let obj: {name: string, age: number, isHandsome: boolean} = 
{
 name: "tamakipedia",
 age: 20,
 isHandsome: true
}

interface

オブジェクトの型アノテーションは長すぎると読みづらいので
名前をつけることが可能。

// オブジェクトの型を定義
interface Human {
 name: string, 
 age: number, 
 isHandsome: boolean
}

//型をHumanにする
let obj: Human = 
{
 name: "tamakipedia",
 age: 20,
 isHandsome: true
}

let obj.name = 20 //Type 'number' is not assignable to type 'string'

type

interfaceもtype同様、型に名前をつけて参照できるようにします。
こちらはタイプエイリアスと呼ばれるそうです。

// 代入してる
type Human = {
 name: string, 
 age: number, 
 isHandsome: boolean
}

type と interface の違い

interfaceは拡張ができる

interface Human {
 name: string, 
 age: number, 
 isHandsome: boolean
}

//新しいプロパティを追加
interface Human {
 isAdorable: boolean
}

//型をHumanにする
let obj: Human = 
{
 name: "tamakipedia",
 age: 20,
 isHandsome: true,
 isAdorable: true
}

おしまい

今読んでいる参考書にはinterfaceを使っていることが多く、
別の記事にtypeを使ったチュートリアルがあったので調べてみました。
拡張できると可読性が低くなるので使用注意ですね!!

参考 https://zenn.dev/luvmini511/articles/6c6f69481c2d17

HeadlessCMS と 従来のCMS との違い

HeadlessCMSと従来のCMSの違いについてまとめました。
 
f:id:okinawanpizza:20211021111401p:plain

HeadlessCMSとは

  • Head(ビュー、見た目を構築する部分)less(がない)、つまりレイアウトをツール内で管理しないCMSのこと
  • 入稿画面付きのapi作成ツールと考えるとイメージしやすい

メリット

  • マルチデバイスに対応できる
    • 従来のCMSだとアプリ版に表示するときにweb view を利用する必要があった
  • CMS機能を後付けできる
    • 従来だと静的ページにブログ機能をつける時は、HTMLファイルごとWordPressなどのCMSに置き換える必要がある
  • 表示速度が早い、サーバーコスト削減、ハイセキュア

デメリット

  • エンジニアと非エンジニアの両方が理解しないといけない
  • プレビュー機能CMS外に自作する必要がある

ハイブリットCMSもちらほら

  • 上記のHeadlessCMSのメリットと従来のCMSのメリットを兼ね備えたようなCMSも今後のトレンドになるかもしれない

おしまい

ブログのリニューアルに際して、気になっている単語を一気にまとめてみました。
今まで使っていたwordpressとの違いやHeadlessCMSにもデメリットがあることなどがしれてよかったです。
引き続きブログ作るぞ〜!

おしまい

Contentfulの設定方法

こんにちはkoです。
来年に向けてブログのリニューアル行っています。
Contentfull × Vercel × Next.js でブログを作成しようと思っています。
今日はそのうち、Contentfulに関する設定方法を記述していきます。

f:id:okinawanpizza:20211020223251p:plain

 目次

Contentfulとは

Contentfulとは、「Headless CMS」 と呼ばれるAPIベースのCMSです。
Contentful以外にも、GraphCMS、Micro CMS などがあります。

Headless CMS ツール比較参考記事
https://wk-partners.co.jp/homepage/blog/hpseisaku/htmlcss/headless-cms/

初回登録

下記リンクから初期登録します。
https://www.contentful.com/sign-up/
githubを連携したら自動的にサインアップできます。

完了したらログインし、
Space、ContentModel、Field、Contentの作成を行います。

Space

f:id:okinawanpizza:20211021013205p:plain

Spaceはブログごとの単位のことを指します。
(GitHubでいうリポジトリのようなものだと捉えています。)

設定方法:
「左上のハンバーガーメニュー」>「Create Space」

ContentModel

f:id:okinawanpizza:20211021004950p:plain

In short, a content model gives structure and organization to your content. Within your overall content model

ContentModelはコンテンツの構造のことです。
例えばブログを書くのであれば「タイトル」「画像」「内容」などの項目が設定されると思います。
その項目に関する仕様のことです。

ここでは content type(=モデル名) を設定します。
設定方法: 「左上にあるAdd content type」>「モーダルの項目を記述」

f:id:okinawanpizza:20211021005855p:plain

モデリンクに関するリファレンス
https://www.contentful.com/help/content-modelling-basics/

Field

f:id:okinawanpizza:20211021010056p:plain

Fieldは「タイトル」「サムネ」「記事本文」などといった
コンテンツ内の項目のことです。

設定方法:
「add field」>「モーダルに表示される9つの型を選択」>「ラベル名や詳細の設定」

Content

f:id:okinawanpizza:20211021010457p:plain

Contentでは、実際にモデルで設定した仕様に従ってコンテンツを作成することができます。

おしまい

以上がContentfulの設定になります。
最初調べた時は2~3時間くらいかかったのですが
まとめてみると意外と手順が少なくてびっくりしました。
そういった手軽さも従来のCMSと比べて良いですね!

次は少し気になったHeadless CMS と 従来のCMS の具体的な違いについて
自分なりにまとめてみようと思います。

おしまい

【React】関数コンポーネントとクラスコンポーネントの違いについて

コンポーネント

クラスコンポーネント

① React.Component を拡張して作られるJavaScriptクラスである。

import React, { Component } from "react";     //拡張する Component をインポート

class ClassComponent extends Component {  // extends で拡張したクラスを生成
 render() {                          // レンダリングする要素は render() メソッド内で返される
    return <button>push here</button>;
 }
}

② propsの受け渡しは this.props を使う (プロパティー)

class ClassComponent extends React.Component {
  render() {
    const { who } = this.props;
 return <button>push { who }</button>;
  }
} 

③ state処理はconstructor内に記述する

class ClassComponent extends React.Component {
 constructor(props) {
   super(props);
   this.state = {
     count: 0
   };
 }

 render() {
   return (
     <div>
       <p>count: {this.state.count} times</p>
       <button onClick={() => this.setState({ count: this.state.count + 1 })}>
         Click
       </button>
     </div>
   );
 }

関数コンポーネント

① React.Component を拡張して作られるJavaScriptクラス。

import React from "react";
 
const FunctionalComponent = () => {
 return <button>push here</button>;
};

② props の受け渡しは引数にて行う。

const FunctionalComponent = ({ who }) => {
 return <button>push { who }</button>;
};

// <FunctionalComponent who="me" />

③ state処理はuseState()を使う。

const FunctionalComponent = () => {
 const [count, setCount] = useState(0);

 return (
   <div>
     <button onClick={() => setCount(count + 1)}>{count} time(s) pushed </button>
   </div>
 );
};

【Typescript】モジュール 'styles/***.css' またはそれに対応する型宣言が見つかりません。

typescriptに scss を import しようとするとエラーになってしまう。

解決

next-env.d.tsファイルに以下を追記

//make it possible to import scss file
declare module '*.css';
// or scss
declare module '*.scss';

これで import が可能になります。

参考:How to fix TypeScript cannot find module CSS/SCSS in Next.js

PHPで「Parse error: syntax error, unexpected '['が出た時の解消法

はじめに

wordpressサイトの目次に関する不具合の改修を行なっている際に起こったエラーのメモです。

次のような配列を作成しようとすると
「Parse error: syntax error, unexpected '[' in ~」というエラーになりました。

<?php
$a = [ 'foo' => 'hoge', 'bar' => 'hoge' ];
?>

var_dump($a);

原因

PHP5.4以降から配列の短縮構文が追加され、array関数の代わりに短縮構文[]が使えるようになりました。

//①
<?php
$array = array(
    "a" => "b",
    "c" => "d",
);
 
//②
$array = [
    "a" => "b",
    "c" => "d",
];
?>

PHP 5.4 以前は①、それ以降は①、②の両方が利用できます。

使っているPHPのバージョンが 5.4 以下だったために起こったエラーでした。

対処

array関数を使用して以下のような形を取りました。

  $array = array();

参考: PHP: 配列 - Manual

エラーにぶつかった際に、バージョンによるものか?と疑う視点も必要なのだと勉強になりました。