LoginSignup
6
4

More than 5 years have passed since last update.

設定不要で簡単にNode.jsアプリケーション構築できるZero Serverを試してみた

Posted at

Zero Serverについて公式ページを読んで試したみたという内容です。
詳しく知りたい方は公式を参照するようお願いします。
間違いなどありましたらご指摘お願いいたします。 :bow:

Zero Server とは

※githubのreadmeの説明の部分をgoogle翻訳↓

Zeroは現代のWeb開発を単純化するためのWebフレームワークです。 パッケージ管理やルーティングを気にせずにアプリケーションを構築できます。 Node.js、React、HTML、MDX、および静的ファイルを組み合わせてコードを記述し、それらをすべてフォルダーに入れるのと同じくらい簡単です。 ゼロはそれらすべてに役立つでしょう。 作業を簡単にするために、ルーティング、バンドル、およびトランスパイルのための通常のプロジェクト構成がゼロで抽象化されています。

自分でいろいろ設定しなくても、require('moment') と書けば、Zero Serverが自動でmomentをインストールして、解決してくれます。

Installation

bash
npm i zero

Hello World

時刻を教えてくれるアプリケーションを作成する

time.js
const moment = require("moment")

module.exports = (req, res) => {
  var time = moment().format('LT');   // 11:51 AM
  res.send({time: time })
}
bash
npx zero

http://localhost:3000/time にアクセスすると、

image.png

time.jsで作成しましたので、localhost:3000/time にアクセスすると内容を表示してくれます。

moment を自動でインストールして使えているのが確認できました。


サーバーを稼働し続けた状態で、index.jsx を作成する。

index.jsx
import React,{ Component } from 'react'

export default class extends Component {
  static async getInitialProps(){
    const { time } = await fetch("/time").then((resp) => resp.json())
    return { time }
  }

  render() {
    return <p>Current time is: {this.props.time}</p>
  }
}

image.png

先ほどの/time からjsonを受け取り、jsxも正しく動作しているのが確認できました。

webpackなどの設定をいじる必要がなく、簡単にアプリケーション構築できました!

Static Files

画像やテキストファイルなどの扱いについて

.js, .ts, .jsx, .tsx, .htm, .html, .md, .mdx以外の場合は、プロジェクトディレクトリにファイルを置けばそのまま表示してくれるようでした。

※プロジェクト直下のディレクトリにnihon-amagaeru.jpg を置いた場合

image.png

Node.js (.js, .ts)

hello.js
module.exports = function(req, res) {
  res.send("Hello");
}

Zero はExpress.jsを使用しているようなので、req, resのリクエスト・レスポンスのオブジェクトはExpressのものと同じ。


./api/login.js とファイルを設置した場合は http://localhost:3000/api/login でアクセスできる

/api/logion.js
module.exports = function(req, res) {
    res.send("Login Api");
}

image.png

パラメータの取得

param-test.js
module.exports = function(req, res) {
    console.log(req.body)
    res.send({body: req.body})
}

POST, PUT, PATCH, DELETE でパラメータを問題なく受け取れるようでした。

bash
$ curl http://localhost:3000/param-test -X POST -H "Content-Type: application/x-www-form-urlencoded" -d "category=1&sort=asc"
{"body":{"category":"1","sort":"asc"}}
$ curl http://localhost:3000/param-test -X POST -H "Content-Type: application/json" -d '{"category":1, "sort":"asc"}'
{"body":{"category":1,"sort":"asc"}}
$ curl http://localhost:3000/param-test -X DELETE -H "Content-Type: application/json" -d '{"category":1, "sort":"asc"}'
{"body":{"category":1,"sort":"asc"}}

Route Rewrites

user.js
module.exports = function(req, res) {
    console.log(req.params)
    res.send({params: req.params})
}

/user/lukeにアクセスした時に、./user/luke.jsがなかった場合、req.params['luku']と設定してくれます。

image.png

image.png

TypeScript

.tsファイルにすると、TypeScriptとして動作させることができる

hello-ts.ts
import * as express from "express";

function handler(req: express.Request, res: express.Response) {
  res.send("Hello TypeScript")
}
export default handler

image.png

React

hello-react.jsx
export default () => <h1>Hello React</h1>

image.png

Populating <head>

react-helmet.jsx
import {Helmet} from "react-helmet";

module.exports = () => (
  <div>
    <Helmet>
        <meta charset="UTF-8" />
        <title>Page Title</title>
        <link rel="canonical" href="http://mysite.com/example" />
    </Helmet>
    <h1>Hello World</h1>
  </div>
)

react-helmetが使えるので、metaタグなどの扱いも簡単です

image.png

Importing CSS/Sass

cssとscssがサポートされているようです。

react-style
import "./style.scss"
module.exports = ({name}) => (
  <h1>Hello {name}</h1>
)
style.scss
body {
    h1 {
        color: blue;
    }
}

image.png

TypeScript

.tsxとするとことで使用することができました。

react-ts.tsx
import * as React from "react";

export default class HelloWorld extends React.Component<{}, {}> {
    render() {
       return (<b>Hello TypeScript</b>);
    }
}

HTML (.htm, .html)

バンドラーはparcelが使われているとのことです。なので<script>タグのsrcから自動で解析してくれました。

html-test.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <script src="./style.js"></script>
    <title>Document</title>
</head>
<body>
    <h1>Hello</h1>
</body>
</html>
style.js
import "./style.scss";
style.scss
body {
    h1 {
        color: blue;
    }
}

image.png

Markdown / MDX (.md, .mdx)

自動で.mdファイルをhtmlに変換してくれる

markdown.md
# Markdown in Zero
Zero renders `.md` files too.

image.png

mdx-test.mdx
import Btn from "./component/btn"

# Hello, world!

<Btn />

image.png


自分で試したコード

最後まで読んでいただいてありがとうございましたm(_ _)m

6
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4