以下のような過去の記事で再三言っていますが、Web系のプログラミングはほぼ初心者です。
そんな中、フロント用にTypeScript
に手を出した挙句、ほかのモジュールが必要になったので、node
にも手を出しました。
教えてくれる人が周りにいなかったので、自己流でいろいろやりましたが…
やったことのメモを残すので、詳しい人正しいか教えてください(他力本願)
使いたかったモジュール
sheet.js
(スクリプト名:xlsx.js
)です。クライアントサイドでExcel
を読み込んで、サーバーサイドに送れないものか、試行錯誤していました。
その上で、以下の事項を担保しようとしました。
TypeScript
を使って型付で開発する- トランスパイルは自動(コマンド一つ)でやる
tsc
コマンドみたいに、一発でやりたい Django
から呼び出す(nodeじゃない。Django
のTemplate
として利用する)
やったこと
以下、Windows
環境が前提です。
node.jsの準備
そもそもTypeScript
を使うのにnode.js
(というかnpm
)が必要なので、入れました。
これは特に書くことはありません。単にインストールしました。
npmを使う
npm
、つい最近までグローバルインストールしかやったことなかったんですよね。
TypeScript
をインストールしたときは
npm install -g typescript
ってやりました。
記事を見ていると、--save
とか--save-dev
とか出てくるのですが、これの意味が分かっていませんでした。
以下の記事参考にしていました。あまりにも基礎知識なさ過ぎて、こんなにわかりやすく書いてあるのに理解できませんでした。
saveの意味
nodeを使っていると、まず
npm init
をやれと書いてあります。これにより、package.json
というファイルが生成されます。デフォルトではこんな感じです。
{ "name": "app", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC", }
学んだこと
このファイルの一つの側面は、システムや開発で利用するパッケージを明示することにあります。
そして、--save
を付与した場合は、システムで使うパッケージであることを示し、--save-dev
を付与した場合は開発で使うパッケージであることを示します。
例えば、typescript
モジュールは、システムの本番環境では利用しません。システムでは、.ts
ファイルをコンパイルした結果である.js
ファイルを使います。
よって、package.json
を置いたフォルダで
npm install --save-dev typescript
のように、--save-dev
を付けてインストールします。すると、
{ "name": "app", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC", "devDependencies": { "typescript": "^3.1.6" } }
のように、devDependencies
という項目が追加されます。
xlsxを入れる
次に、本番で動くモジュールであるxlsx
を入れます。
npm install --save xlsx
のように書きます。すると、package.json
は
{ "name": "app", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC", "devDependencies": { "typescript": "^3.1.6" }, "dependencies": { "xlsx": "^0.14.1" } }
のようになります。dependencies
が増えます。
これだけじゃ動かない
これをやったうえで、TypeScript
で実装を行います。すると、xlsx
の型参照はきちんと表示されます。
コンパイルも通ります。しかし、いざ動かすと、
Uncaught ReferenceError: exports is not defined
と表示され、
というエラーになります。
意味が分からない
どうしろと…
とりあえず、きっとこういうことだろうと思いました。
- そもそも、
commonjs
ではimport
はまだ使えない(だからエラー) TypeScript
にこんな感じで書いてトランスパイルしている限り、JavaScript
側でこのエラーは出る。回避不可- だから、
webpack
やbrowserify
を使わないとダメなんだろう
browserify
と、TypeScript
用にtsify
が必要とのことだったので、入れてみました。
そもそもnode.jsならエラーも出ないということもわかりました。
browserify
どちらも開発用なので、
npm install --save-dev browserify tsify
と書いてインストール。
コマンドで、
browserify index.ts -p [tsify] > bundle.js
のようにすると、bundle.js
のファイルにindex.ts
が参照しているファイルがすべて書き込まれるとのことだったので、試しました。
確かにできました。しかし、xlsx
モジュールすべてが結合するので、全体が3MBぐらいあるファイルが出来上がりました。
…いいの?
おわりに
この記事は唐突に終わりです。ひたすら試行錯誤しましたが、結局上のようなことをやってみました。
上のようなことを試して、とりあえず動くようになった。そこまでが成果です。
しかし、これでいいのだろうか…というのが正直なところです。JavaScript
が3MBとかダメだろ…という。
まあ、クライアントにキャッシュすればよいのでしょうが。このあたりの戦略が良く分かっていません。
誰か教えて…(´・ω・`)