學習基本的 javascript 和 node.js
安裝完 node.js 開發環境並且也知道了常用的 npm
指令之後, 接下來來看一些 javascript 以及 node.js 的基礎. 俗話說萬丈高樓平地起, 這些基本概念沒學好之後可是很難精進的.
Examples and source
範例檔案請見 github
執行 javascript 檔案
我們來寫一個可以在 terminal 列出 Hey you
的 javascript 程式. 打開你的文字編輯器然後輸入 console.log( 'Hey you' );
並另存新檔成 hey.js
到桌面. 然後打開 terminal 輸入以下指令.
$ cd ~/Desktop $ node hey.js # -> Hey you
使用外部檔案
要寫出模組化的程式就必須把程式切分的乾淨. node.js 遵照 CommonJS 的慣例, 用 require
以及 exports
來作檔案和模組之間的溝通.
從實際範例會比較清楚的看到該如何使用. 假設我們要從 source.txt
這個檔案讀取資料並在 terminal 印出. 之後再將裡面的 I am
改成 You are
並另存新檔為 changed.txt
. 在這裡我們故意將上面所有的動作分成三個檔案 read.js
, write.js
還有 run.js
, 並將這四個檔案放在同一個資料夾裡面. 最後執行 run.js
來得到我們要的結果.
source.txt
I am Ben.
read.js | 這裡負責讀檔以及在 terminal 列出
// require core module `file system` var fs = require( 'fs' ); // exports 2 methods for other modules or files to use module.exports = { read : function( path, callback ){ // read file data synchronizely var data = fs.readFileSync( path ); // execute the callback if there is one callback && callback( data.toString()); }, print : function( data ){ // print out the data console.log( data ); } };
write.js | 我們將寫入的部分放進這個檔案
// require core module `file system` var fs = require( 'fs' ); // exports 1 method for other modules or files to use module.exports = { write : function( filename, data ){ // write to file synchronizely fs.writeFileSync( filename, data ); } };
run.js | 執行檔
// to use methods from other files we simply use `require` with path name var reader = require( './read' ), writer = require( './write' ); // call `read` method from read.js to read `source.txt` reader.read( './source.txt', function( data ){ // change `I am` to `You are` var changed = data.replace( 'I am', 'You are' ); // print out the data reader.print( data ); // save the changes to `changed.txt` writer.write( './changed.txt', changed ); });
Q&A
下面 3 種語法有什麼不同呢?
var something = require( './something' ); var something = require( './something.js' ); var something = require( 'something' );
第一種和第二種作法基本上一樣. 如果 node.js 找不到 ./something
這個檔案便會自動尋找 ./something.js
. 所以基本上用 ./something.js
會快一點點. 至於第三種呢, node.js 會尋找叫做 something
的套件. 關於如何寫 npm 套件會在後面的文章另外說明.
exports VS module.exports
他們很相似但是還是有些不同. 底下兩種寫法用起來一樣.
用 `module.exports`
module.exports = { do_a : function(){ // do something ... }, do_b : function(){ // do something ... } };
用 `exports`
exports.do_a = function(){ // do something ... }; exports.do_b = function(){ // do something ... };
以上兩者我們都可以像下面這樣使用
var something = require( './something' ); something.do_a(); something.so_b();
但有些時候我們只想要 require 後直接使用, 用上面的作法的話我們必須要
var something = require( './something' ); something.something();
這樣實在有點煩人, 我們必須重複 module 和 method 的名稱都為 something
. 但要是我們不想重複呢?
var something = require( './something' ); something();
這就是 exports
和 module.exports
不同的地方. module.exports
你可以直接像下面那樣用但是 exports
不行.
// this works module.exports = function(){ // do something }; // this is not going to work exports = function(){ // do something };
require
只會載入檔案一次然後存放在記憶體裡面, 所以不用怕效能的問題.
下面是一些從其他語言過來的人比較常對 javascript 搞混的幾點
用 node.js 以及 mongoDB 來作 C.R.U.D
學完 javascript 以及 node.js 的基本. 接下來我們來用 node.js 以及 mongoDB 寫一個 http server 來作個有 C.R.U.D( create, read, update, delete data ) 動作的網站. TODO list 會是一個不錯的目標.