--
--

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Tag:

21
2016

Node.js+Express+Sequelize+AngularJS1で開発してみた感想

CATEGORYJavaScript
ここ何年かJava+PHPなサーバーエンジニアとして働いてきた感じですが、7月から新しい会社でNode.jsを使うこととなり、んで機種転換のために1ヶ月半近く表題の環境で好き勝手に研修課題作らせてもらったので、使ってみた感想とか書いてみる。
なお、自分は研修前はJavaScriptはWebアプリのおまけでちょっとした小道具に使うぐらい(ボタンON/OFFしたり)なスキルレベル。でも今は一端なJSerの仲間入りをできたはず…?

※ 実業務の感想ではないので、パフォーマンスとか複数人で開発した場合のあれこれとかは話半分ぐらいで。

Node.js

名前は昔から知ってたし興味はあったけど、真面目に調べたのは今回が初めて。

で感想としては、これまで触ってきた言語やサーバーサイドの仕組みと比べて、またすごく独特。
JavaScript特有の非同期処理ガンガンな世界が溢れてて、マルチスレッドでマシンパワーでブン回すJavaとも、パフォーマンスより開発のし易さだよねなPHPとかともまた違う。
職人技でパフォーマンス稼ごうとしてる気がする。

↓がごく簡単なExpress+Sequelizeのコントローラの例。単純な処理がややこしい感じになるのが伝わると思う。
const express = require('express');
const router = express.Router();
const User = require('../../models').User;

/* ユーザー情報 */
router.get('/:id', function(req, res, next) {
let user;
User.findById(req.params.id)
.then((u) => {
user = u;
return user.getItems()
})
.then((items) => res.json({body: {user: user, items: items}}))
.catch((e) => res.status(500).send(e.message));
});

module.exports = router;
(実際はこんぐらいでもモデルとかにメソッド化するし、例外処理もエラーハンドラに投げるけど例ということで。)

自分がJavaScript構文慣れてないってのもあるにしろ、なんというか開発者に優しくない。
プログラマーが注意深く注意深くボトルネックを作らないように気を付けてコードを書かないといけない。
いや他の言語だってそうなんだけど、シングルスレッドというNode.jsの仕組みとそれ前提のライブラリの特性上、些細な処理までみんな非同期で作らなくちゃいけなくて、エラー処理も見落とさないよう注意が必要で、なんというか性能のためにプログラマーに負荷を強いる環境だと思った。

後、後述するExpressやらの問題もあり、普通のWebアプリをこれで作るのには全くお勧めできない感がある。
(たいていのWebアプリじゃ、ボトルネックはI/Oだし、パフォーマンスだって台数増やせば何とかなるし。)
でも、APIとかで個々の処理自体はさほど複雑じゃないサービスや、ゲームみたいなパフォーマンスが必要なとこではなるほどこういう選択肢もあるのかと思った。

Express

Node.jsのデファクトスタンダードらしいWebフレームワーク…なんだけど、正直これがデファクト?という風に感じた(汗
JavaやらPHPやらのフルスタックのフレームワーク触ってきた身からすると、凄く…薄いです。Node.jsの上に、ごくごく軽いレイヤーを被せましたって感じのフレームワーク。
どうも、最低限の機能だけを提供して、拡張はライブラリやらコンポーネントやらで行ってね!という方針らしい。

Javaとか他の言語に例えると、Node.jsはあくまでTomcatみたいなWebコンテナでしかなく、Expressはサーブレットに相当するんじゃないかって気がしてくる。そういうレイヤーのフレームワーク。
だから、Webアプリのフレームワークって感じではあんまない。

でも、一応Passportとかの認証ライブラリもあるので、シンプルなWebアプリなら十分いけそうな気はした。

Sequelize

Node.jsのデファクトスタンダードらしいORMフレームワーク。詳しくは前回参照。前回も書いたけど、こっちは結構機能が充実してる。
ただ、出自が別物っぽく、Expressと滑らかに繋がらないのが玉に瑕。

使ってみた感じ、Sequelize自体は結構いい。使える。
ただ癖が強いので好みは分かれそう。
でも他の言語のORMと比べて、特別優れているというわけではない。

AngularJS 1

本格的なクライアント側JavaScript初めてなので楽しい!✌('ω')✌

サーバー側とは打って変わって、幾多のツワモノが群雄割拠するクライアント側JSフレームワークの有名どころだけあって、機能が充実してるし、使いやすい。
フルスタックで必要な機能がみんな揃っていて、構文も統一されてて、サクサクアプリ作れて、やっててとても楽しかった。
Webアプリでも今はこんなリッチなものが作れるんだ!というのを実感させられた。
Webアプリ作っているというか、WindowsアプリをHTMLの基盤の上で作ってる気分になった。

↓がごく簡単なAngularJS 1のコントローラの例。非同期なのはサーバー側と同じ…だけど、クライアント側だとなんか許せる(;´∀`)
/* ユーザー情報編集 */
app.controller('userEditController', function($scope, $routeParams, $location, $http, $window) {
/**
* 初期表示へのリセット(指定されたIDのユーザーの表示)。
* @function reset
*/
$scope.reset = function() {
$http.get('/api/users/' + $routeParams.id)
.then((response) => $scope.user = response.data)
.catch((response) => $window.alert(response.status + " " + response.data));
}

/**
* 更新処理。
* @function put
*/
$scope.put = function() {
$http.put("/api/users/" + $scope.user.id, $scope.user)
.then((response) => $location.path("/users"))
.catch((response) => $scope.error = response.data);
}

// 初期表示はリセットを呼び出し
$scope.reset();
});

しかしそんなAngularJSにもいくつか課題が。
まず、バージョンアップで度々構文が変化しているので、正解が分かりにくい。
↑のサンプルも$scopeに値入れてるけど、今はthisに入れるのが推奨っぽい。
さらに、AngularJS 2ではもう全部ガラッと変わってしまったらしいので、付いてくの大変そう。知識短い命だった。

それから、これはAngularJSというかクライアント側JavaScriptの問題点だと思うけど、環境周りが混沌としすぎ。
素のJSでも書けるけど、効率的にやろうとするとBabelだのBrowserifyだので…開発環境を整えるまでが長い?

後は、Sequelizeと似たような話だけど、AngularJSも自分の世界を持ってる系フレームワーク(importではなくDIとか)なので、クライアントもサーバーもJavaScriptだからやりやすいか…と思いきや、3つの異なる世界のルールを学んで、各々の世界ではそれに合わせる必要があって、凄く混乱させられた。
さらに最初はサーバー側がES6, クライアント側がブラウザネイティブでES5でやってたので、使える構文も違った。事故ったからBabel入れたんだけど(--;
加えて分野が違うから挙げてないけど、実際はここにUnityでC#のゲームも並行開発していたので、脳みその切り替えはしんどかった(--;


以上、JavaScriptあれこれの感想はこんなところ。発展してるけど、今はEcmaScript 2015 (ES6) に切り替わる過渡期で、各フレームワークともそれ以前のいろんな仕様が統一される前の時代に作られたものだからややこしい、ってのが難点かな。
今後何年かして統一されていくか、はたまた全てを置き換える新しいフレームワークが出るかするまでは、サーバーサイドは特殊用途がメインかなーと思った。

あとは、今回は試してないけど、どうせトランスコンパイラ入れるならクライアントもサーバーもTypeScriptとか使うのもありかもと思った。
非同期乱舞のJavaScriptで大規模システムおっかないけど、改良された構文ありきならだいぶマシかもしれない。
スポンサーサイト

Tag: JavaScript Nodejs Express Sequelize AngularJS

0 Comments

Leave a comment

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。