質問: 今までは,Androidアプリ開発をしてきたのですが,Webアプリを開発したいと思い勉強を始めたところです.HTMLを勉強して,いちいちタグを書くのが面倒だと感じPugを知りました. Node.jsは一般的にサーバーサイドで用いられると聞き,ドットインストールで学習した際も,httpサーバを立ち上げたり,.ejsに値を差し込んだりとNode.jsがサーバーサイドで用いられることを体験しました. しかし,PugはAltHTMLということでサーバーサイドというかフロントエンドの認識であり,npmでインストールしなければならない点に疑問を持ちます.Pugに限らず,ElectronについてもGUIを作成するのに何故npmでインストールするのか分かりません.他にも,GitHubでリポジトリを色々見ていると,READMEでnpmを使ってインストールする旨がよく書かれています.それらは,本当にサーバーサイドで用いるように開発されているのでしょうか? 以上の疑問から,本当はNode.jsはサーバーサイドというよりCLIで実行できるプログラムを作るためのJavaScript環境という説明が正しいのではないかと思ってきました.私の解釈が間違っているのは重々承知していますが,PugやElectronのようなフロントよりのプログラムのインストールにNodeが必要になってくる理由について教えていただければと思います.
回答: > > 本当はNode.jsはサーバーサイドというよりCLIで実行できるプログラムを作るためのJavaScript環境という説明が正しいのではないか > > > これは質問者さんが感じてる方がその通りです。 じゃあ何処からNode.jsがサーバーサイド用という話が出てきたか? これに関してはNode.js開発者の動機が関係しています。 その理由が「何も気にする必要なくC10k問題を解決出来るWebサーバがほしかったから」だったと記憶しています。 その為、型やメモリ管理のコアな部分だけV8エンジンを拝借して、C++でファイル操作や自由なネットワーク通信のモジュールをくっつけてNode.jsが完成しています。 > > npmでインストールしなければならない点に疑問を持ちます > > > パッケージ管理ソフトと言うものは利用した経験はありますか? MacならHomebrew、CentOSならyum、Debianならaptと言うふうにOSのコマンドラインツールや開発ツールを導入する為のツールが存在し、 また言語に付くパッケージ管理ソフトもあります。 Rubyならgem、Pythonならpipといった具合です。 Node.jsはnpmというパッケージ管理ソフトと二人三脚みたいな所があります。 プロジェクトルートだと決めた所で`npm init`でpackage.jsonファイルを生成し、npmがもつ膨大なオープンソースライブラリから好きなモジュールをDLして自分のプログラムに差し込むことができます。 その経緯は全てpackage.jsonに書き足されていくので、もし新しい開発者がプロジェクトに参画してもpackage.jsonを用意して`npm install`コマンド一撃で既存の開発環境が出来上がりです。 そういう経緯でnpmというOSS共有サービスに寄付すれば誰でもインストールできるようになります。 無断で勝手に貴方の極秘ファイルを吸い上げるわけではなく、GitHubのようにアカウントを取得して、GitHubと同じくパッケージの開発者か、許可を出した人以外はnpmのパッケージを更新出来ないようになります。 この辺の整備があるので、各個人がこっそりGitHubで公開するような感じてはなく、 npmを介してライブラリやモジュールを入れるのが一般的です。 > > ElectronについてもGUIを作成するのに何故npmでインストールするのか分かりません > > > ネットにはChroniumというオープンソースのブラウザが転がっています。 HTMLとCSSさえあればページを表示してあちこちクリックしてブラウザとして使えそうですよね? しかしJavaScriptはファイル読み書きやネットワーク通信という機能が貧弱で好き勝手なデスクトップアプリを作る面で評価すれば論外です。 もしブラウザで動くスクリプトでファイルを読み書き出来るなら、 「Cドライブのデータを全て消去して」という命令を書き込んだJavaScriptを私のサイトに記述しておけば、私のサイトを閲覧したユーザーのハードディスクは全滅です。 そういうセキュリティ的な都合で、情報を閲覧するブラウザではJavaScript越しにファイル操作の権限は一生与えませんよみたいな仕組みになっています。 そこでJavaScriptの代わりにNode.jsを突っ込んで、documentやwindowのグローバル変数を紐付けしたのがそれです。 まぁ、ちゃんと触った事無いので細部に関してはドキュメント等をしっかり読んでください。