Nodejs

Node.jsとは #

  • サーバーサイドJavaScript環境のこと.
  • サーバーサイドもJavaScripで記述できるようにした.
  • シングルスレッドでノンブロッキングI/Oを行う.
  • GitHubリポジトリ: https://github.com/nodejs

インストール #

Mac: https://nodejs.org/en/

Ubuntu: Official Node.js binary distributions

テストツールの種類 #

  1. テストの環境を提供する( Mocha, Jasmine, Jest, Karma
  • テストの構造を提供する( Mocha, Jasmine, Jest, Cucumber)
  • アサーション機能を提供する( Chai, Jasmine, Jest, Unexpected)
  • 生成, 表示, テスト結果をウォッチする( Mocha, Jasmine, Jest, Karma
    以前の実行時からの変更が意図されたものであることを確認するために,
  • コンポーネントやデータ構造を生成し, スナップショットを比較する( Jest, Ava
  • モック, スパイ, スタブを提供する( Sinon, Jasmine, enzyme, Jest, testdouble)
  • コードカバレッジのレポートを生成する(Istanbul, Jest)
  • シナリオ実行の管理ができるブラウザ, または疑似ブラウザの環境を提供する( Protractor, Nightwatch, Phantom, Casper)

Reference: 2017年JavaScriptのテスト概論

日付を扱う #

引数で判定 #

引数1つでok. それ以外は強制終了する.

if(process.argv.length !== 3) {
  console.log(`csvファイル名を入力してください.`);
  process.exit(1); // 正常に強制終了する
}

mapの中で非同期処理 #

CSVを扱う #

  • csv.jsを使えば簡単.
  • CSVの生成/読み取り/変換/書き出しができる.
  • stream/コールバック/同期的にデータを処理ができる.

stream #

以下を行ってから

npm init -y
npm i --save csv
touch index.js

index.jsに以下を書き込んで

const csv = require('csv');

const generator = csv.generate({seed: 1, columns: 2, length: 3});
const parser = csv.parse();
const transformer = csv.transform(data => {
  return data.map(value => {return value.toUpperCase()});
});
const stringifier = csv.stringify();
// CSVを生成して
generator.on('readable', () => {
  while(data = generator.read()){
    parser.write(data);
  }
});
// CSVを読み込んで
parser.on('readable', () => {
  while(data = parser.read()){
    transformer.write(data);
  }
});
// データを変換して
transformer.on('readable', () => {
  while(data = transformer.read()){
    stringifier.write(data);
  }
});
// 文字列に変換して
stringifier.on('readable', () => {
  while(data = stringifier.read()){
    // 標準出力する.
    process.stdout.write(data);
  }
});

以下を実行する.

node index.js

pipeでstream #

以下を行ってから

npm init -y
npm i --save csv
touch index.js

index.jsに以下を書き込んで

const csv = require('csv');

// CSVを生成して
csv.generate  ({seed: 1, length: 3}).pipe(
// CSVを読み込んで
csv.parse     ()).pipe(
// データを変換して
csv.transform (record => {
                return record.map(value => {
                  return value.toUpperCase()
              })})).pipe(
// 文字列にして
csv.stringify ()).pipe(
// 標準出力する.
process.stdout);

以下を実行する.

node index.js

コールバック #

以下を行ってから

npm init -y
npm i --save csv
touch index.js

index.jsに以下を書き込んで

const csv = require('csv');

// CSVを生成して
csv.generate({seed: 1, columns: 2, length: 3}, (err, data) => {
  // CSVを読み込んで
  csv.parse(data, (err, data) => {
    // データを変換して
    csv.transform(data, data => {
      return data.map(value => {return value.toUpperCase()});
    }, (err, data) => {
      // 文字列に変換して
      csv.stringify(data, (err, data) => {
        // 標準出力する.
        process.stdout.write(data);
      });
    });
  });
});

以下を実行する.

node index.js

同期処理 #

以下を行ってから

npm init -y
npm i --save csv-generate csv-parse stream-transform csv-stringify
touch index.js

index.jsに以下を書き込んで

const generate = require('csv-generate/lib/sync');
const parse = require('csv-parse/lib/sync');
const transform = require('stream-transform/lib/sync');
const stringify = require('csv-stringify');

// CSVを生成して
const csvFile = generate({
  seed: 1,
  objectMode: true,
  columns: 2,
  length: 2
});
// CSVを読み込んで
const input = parse(csvFile, {
  columns: true,
  skip_empty_lines: true
});
// データを変換して
const records = transform(input, record => {
  record.push(record.shift())
  return record
});
// 文字列に変換して
const moji = stringify(records, (err, output) => {
  // 出力する.
  console.log(output);
});

以下を実行する.

node index.js

Streamとは #

  • データストリーム(データの転送単位がブロックより細かいバイト単位で行う方式)を扱うオブジェクト.
  • Streamオブジェクトはデータをストリームとして(データを流れる様にして)扱いたい時に使う.
  • References:
  • Node.js Stream を使いこなす
  • Stream API入門
// ブロッキングでファイルを読み書きする.
// データを読み込んでる間は全ての処理がストップする.
const text = fs.readFileSync('src.txt', 'utf8');
fs.writeFileSync('dest.txt', text);

// 非ブロッキングI/Oでファイルを読み書きする.
// データを読み込んでる間も他の処理はできるが, 書き込みは読み込みが終わってから.
fs.readFile('src.txt', 'utf8', (err, data) => {
  fs.writeFile('dest.txt', data);
});

// 一定量だけデータを読み込んで書き込みを行う.
// 大きなファイルだと大活躍.
const src = fs.createReadStream('src.txt', 'utf8');
const dest = fs.createWriteStream('dest.txt', 'utf8');
src.on('data', chunk => dest.write(chunk));
src.on('end', () => dest.end());

// pipeも使える.
const src = fs.createReadStream('src.txt', 'utf8');
const dest = fs.createWriteStream('dest.txt', 'utf8');
src.pipe(dest);

Streamの種類 #

名称意味
stream.Readable読み取りだけができるストリーム
stream.Writable書き込みだけができるストリーム
stream.Duplex読み取りも書き込みもできるストリーム
stream.Transform読み取ったデータを変換して出力するストリーム

公式Reference #

yarn #

パッケージを最新バージョンへ #

yarn outdated # 新しいバージョンを確認
yarn upgrade # パッケージのアップグレード
yarn upgrade-interactive # 上記2つを一緒に行う