Node.jsの初心者向けガイド パート2





こんにちは!



このNode.jsチュートリアルの翻訳を投稿し続けます。



その他のパーツ:



パート1

パート2

パート3

パート4



JavaScript V8エンジン



V8は、Google ChromeでサポートされているJavaScriptエンジンの名前です。これは、JavaScriptコードを取得してブラウザーで実行するものです。



つまり、V8はJavaScriptランタイムです。DOMおよびその他のWeb APIもブラウザーによって公開されます。



JavaScriptエンジンはブラウザに依存しません。これがNode.jsの出現につながったものです。2009年にNode.jsのエンジンとしてV8が選択され、Node.jsの人気が高まるにつれ、V8は多くのサーバー側JavaScriptの基礎になりました。



Node.jsのエコシステムは巨大であり、V8のおかげで、たとえばElectronを使用してデスクトップアプリケーションを作成できます。



その他のJSエンジン


他のブラウザには独自のJavaScriptエンジンがあります。









これらのエンジンはすべて、JavaScriptで使用される標準であるECMA ES-262(ECMAScript)標準を実装しています。



パフォーマンスについて


V8はC ++で記述され、進化を続けています。すべてのオペレーティングシステムで動作します。



V8実装の機能は考慮しません。ここ見つけることができます。これらは時々、大幅に変更されます。



V8は、WebおよびNode.jsエコシステムの速度を向上させるために、他のJavaScriptエンジンと同様に常に進化しています。



何年にもわたって行われているWeb上のパフォーマンス競争があり、私たち(ユーザーおよび開発者として)は、毎年より速くてより良いツールを手に入れて、この競争から多くを引き出します。



コンパイル


JavaScriptは通常、インタプリタ言語として位置付けられますが、最新のエンジンはJavaScriptを解釈するだけでなく、それをコンパイルします。



これは、Firefox 3.5でSpiderMonkey JavaScriptコンパイラが追加された2009年以降発生しています。



JavaScriptはV8(ジャストインタイム、JIT、動的コンパイル)によってその場でコンパイルされ、実行を高速化します。



直感に反するように思えるかもしれませんが、2004年のGoogleマップの登場により、JavaScriptは小さなコードブロックが記述される言語から、ブラウザで実行される数百または数千のコード行で構成される本格的なアプリケーションが作成される言語に進化しました。



現在、私たちのブラウザーアプリケーションは数時間実行できますが、フォーム検証などの基本的なタスクを解決するための単純なツールではなくなりました。



今日の世界では、JavaScriptのコンパイルは理にかなっています。コードの準備には時間がかかりますが、そのパフォーマンスは解釈されたコードのパフォーマンスを大幅に上回ります。



コマンドラインを使用してNode.jsスクリプトを実行する



Node.jsプログラムを実行する標準的な方法は、グローバルコマンドnodeを実行し、実行可能ファイルの名前を渡すことです。



Node.jsアプリケーションのメインファイルの名前app.jsがの場合、次のように呼び出すことができます。



node app.js


指定したコマンドを実行するときは、ファイルのあるディレクトリにいることを確認してくださいapp.js



Node.jsを終了するにはどうすればよいですか?



Node.jsアプリケーションを停止するには、さまざまな方法があります。



ターミナルからプログラムを実行するときctrl-Cは、で閉じることができますが、プログラムによる方法について説明しましょう。



最も過激なものから始めて、なぜそれが使用されるべきでないかについて話しましょう。



メイン(グローバル、カーネルモジュール)モジュールprocessは、software-Node.jsアプリケーションから抜け出す簡単な方法を提供しますprocess.exit()



Node.jsがこのコード行に到達すると、プログラム実行プロセスはすぐに終了します。



つまり、進行中のコールバック、送信されたリクエスト(保留中)、ファイルシステムのオープンアクセス、書き込み、stdoutまたはstderrそれらすべてがハードアボートされます。



これが許容できる場合はexit()、整数をメソッドに渡すことができます。これは、コードの実行を完了するためのシグナルです。



process.exit(1)


デフォルトでは、終了コードは0で、成功を示します。異なる終了コードには異なる意味があります。これらを使用して、一部のプログラムが他のプログラムと相互作用することを確認できます。



終了コードの詳細については、こちらをご覧ください



プロパティに適切な値を割り当てることもできますexitCode



process.exitCode = 1


プログラムが終了すると、Node.jsはこのコードを返します。



すべてのプロセスが完了すると、プログラムの実行はソフト終了します。



Node.jsでは、サーバーを起動することがよくあります。



const express = require('express')
const app = express()

app.get('/', (req, res) => {
    res.send('Hi!')
})

app.listen(3000, () => console.log('Server ready'))


このプログラムは終了しません。を呼び出すとprocess.exit()、保留中または実行中のすべてのリクエストが中止されます。かっこよくありません。



この場合、シグナルコマンドを送信SIGTERMし、プロセッサシグナルハンドラーを使用して処理processする必要があります接続する必要はありません。デフォルトで使用可能です)。



const express = require('express')

const app = express()

app.get('/', (req, res) => {
    res.send('Hi!')
})

const server = app.listen(3000, () => console.log('Server ready'))

process.on('SIGTERM', () => {
    server.close(() => {
        console.log('Process terminated')
    })
})


シグナルとは何ですか?シグナルはPOSIX通信システムです。イベントが発生したことをプロセスに通知します。



SIGKILL-同様に、プロセスの即時完了についてのシグナルprocess.exit()



SIGTERM-プロセスのソフトエンドに関する信号。このシグナルはupstartsupervisordなどのプロセス制御システムによって



送信できます。このシグナルは、プログラム内で別の関数を介して送信できます。



process.kill(process.id, 'SIGTERM')


または、終了するプロセスのPIDがわかっている場合は、システムで実行されている別のNode.jsプログラムまたはその他のアプリケーションから。



Node.jsで環境変数を読み取る方法は?



メインのNode.jsモジュールにprocessenv、プロセスの開始時に設定されたすべての環境変数を含むプロパティがあります



次に、デフォルトのNODE_ENV環境変数にアクセスする例を示しますdevelopment



process.env.NODE_ENV // development


スクリプトを実行する前に本番環境で値を設定すると、Node.jsの前に本番環境があることがわかります。



同様に、任意の設定された環境変数にアクセスできます。



Node.js REPLの使用方法



このコマンドは、nodeNode.jsスクリプトを実行するために使用されます。



node script.js 


ファイル名を省略すると、REPLモードになります。



node 


REPL(印刷評価ループの実行)は、ユーザーが入力した式を受け入れ、この式の評価結果を返すコードランタイム(通常はターミナルウィンドウ)です。端末に



入るnodeと、次のようになります。



>


端末はスタンバイモードになります。



より正確には、この場合の端末は、JavaScriptコードが入力されるのを待機しています。



以下を紹介しましょう。



> console.log('test')
test 
undefined 
>


最初の値testは、コンソールに出力するように指示したundefinedものであり、実行によって返されを取得した後、別の値をconsole.log()



入力できます。



tab自動補完に使用


REPLはインタラクティブです。コードの作成中に



このボタンtab押すと、REPLは、以前に定義された変数または事前定義された変数から選択して、作成したものを完成しようとします。



JavaScriptオブジェクト


たとえばNumberJavaScriptクラスの名前を入力して、ピリオドを追加してをクリックしますtab



REPLは、このクラスのすべてのプロパティとメソッドを表示します。







グローバルオブジェクト


次のように入力global.して押すと、グローバルオブジェクトのリストを取得できますtab







特殊変数_


コード_の最後に入力すると、最後の操作の結果が表示されます。



ポイント後のコマンド


REPLには、ドットで始まるいくつかの特別なコマンドが含まれています。はい、どうぞ:



  • .help -使用可能なコマンドのリストを表示します
  • .editor-複数行のJavaScriptコードを作成するための編集モードが含まれています。このモードでコードを実行するには、ctrl-D
  • .break-複数行のコードの入力を停止します。押すのと同じctrl-C
  • .clear -REPLコンテキストを空のオブジェクトにリセットし、入力されたすべてのコードを削除します
  • .load -現在の(作業)ディレクトリにあるJavaScriptファイルをロードします
  • .save -REPLセッションを指定した名前のファイルに保存します
  • .exit-REPLを終了します。ダブルタップと同じctrl-C


REPLは、を呼び出さずにマルチサイドコードを入力することを理解しています.editor



たとえば、反復の実装を開始した場合:



[1, 2, 3].forEach(num => {


を押すenterと、REPLは、先頭に3つのドットがある新しい行にジャンプします。これは、コードブロックの操作を続行できることを示しています。



... console.log(num)
... })


.break最後に 入力すると、複数行コードモードが停止し、式は実行されません。



コマンドラインを使用して引数を渡す



Node.jsアプリケーションを開始するときに、任意の数の引数を渡すことができます。



引数は自律型にすることも、キーと値を持つこともできます。



例えば:



node app.js joe


または



node app.js name=joe 


Node.jsコードで値を取得する方法は、これに依存します。



組み込みオブジェクトは、値を取得するために使用されますprocessこのオブジェクト



のプロパティにはargv、コマンドラインから渡された引数の配列が含まれています。



最初の引数はコマンドの完全パスですnode



2番目は、実行可能ファイルの完全パスです。



私たちが関心を持つ引数は、3番目の位置(配列のインデックス)から始まります。



ループ(ノードパスとファイルパスを含む)を反復処理できます。



process.argv.forEach((val, index) => {
    console.log(`${index}: ${val}`)
})


渡された引数は、最初の2つのパラメータなしで新しい配列を作成することによって取得できます。



const args = process.argv.slice(2)


インデックス(キー)なしの引数が1つある場合:



node app.js joe


次のように取得できます。



const args = process.argv.slice(2)
args[0]


この場合:



node app.js name=joe


args[0]-これname=joeが、分解する必要がある理由です。これを行う最良の方法は、引数を処理するためにミニミストライブラリを使用することです



const args = require('minimist')(process.argv.slice(2))
args['name'] // joe


ここでは、各引数の前に2つのダッシュを使用する必要があります。



node app.js --name=joe


Node.jsを使用してコマンドラインに結果を出力する



モジュールによる標準出力 console


Node.jsは、コマンドラインと対話するための非常に便利な方法を多く含むコンソールモジュール提供しますブラウザ



オブジェクトのように見えますconsole



このモジュールの主要なメソッドの1つは、console.log()渡された文字列をコンソールに表示することです。



オブジェクトを渡すと、文字列に変換されます。いくつかの変数



を渡すことができconsole.logます:



const x = 'x'
const y = 'y'
console.log(x, y)


およびNode.jsは両方を出力します。



指定子を使用して文字列をフォーマットすることもできます:



例:



console.log('My %s has %d years', 'cat', 2)


  • %s -変数を文字列としてフォーマットします
  • %d -変数を数値としてフォーマットします
  • %i -変数を整数に変換します
  • %o -変数をオブジェクトとしてフォーマットします


例えば:



console.log('%o', Number)


コンソールの掃除


console.clear() コンソールをクリアします(動作は使用するコンソールによって異なります)。



カウント要素


console.count()便利な方法です。



このコードを調べます。



const x = 1 
const y = 2 
const z = 3
console.count(
    'The value of x is ' + x +
    ' and has been checked .. how many times?'
)
console.count(
    'The value of x is ' + x +
    ' and has been checked .. how many times?'
)
console.count(
    'The value of y is ' + y +
    ' and has been checked .. how many times?'
)


カウンターはラインディスプレイの数をカウントし、この数を表示します。



The value of x is 1 and has been checked .. how many times?: 1
The value of x is 1 and has been checked .. how many times?: 2
The value of y is 2 and has been checked .. how many times?: 1  


リンゴとオレンジの数を数えることができます:



const oranges = ['orange', 'orange']
const apples = ['just one apple']
oranges.forEach(fruit => console.count(fruit))
apples.forEach(fruit => console.count(fruit))


スタックトレースの表示


たとえば、「このコードにどのように到達したのか」という質問に答えるために、関数のスタックトレースを表示する必要がある場合があります。



あなたはそれを行うことができますconsole.trace()



const function2 = () => console.trace()
const function1 = () => function2()
function1()


これにより、スタックトレースがコンソールに出力されます。Node.js REPLで上記のコードを実行すると、コマンドラインに次のようになります。



Trace
    at function2 (repl:1:33)
    at function1 (repl:1:25)
    at repl:1:1
    at ContextifyScript.Script.runInThisContext (vm.js:44:33)
    at REPLServer.defaultEval (repl.js:239:29)
    at bound (domain.js:301:14)
    at REPLServer.runBound [as eval] (domain.js:314:12)
    at REPLServer.onLine (repl.js:440:10)
    at emitOne (events.js:120:20)
    at REPLServer.emit (events.js:210:7)


コード実行時間のカウント


time()および を使用して、関数の実行時間を簡単に計算できますtimeEnd()



const doSomething = () => console.log('test')
const measureDoingSomething = () => {
    console.time('doSomething()')
    //  -      
    doSomething()
    console.timeEnd('doSomething()')
}
measureDoingSomething()


stdoutとstderr


ご存知のとおり、console.logはメッセージをコンソールに出力するのに最適です。これは標準出力またはと呼ばれますstdout



console.errorストリームを表示しますstderr



このストリームはコンソールに出力されませんが、エラーログに書き込まれます。



出力のスタイル


エスケープシーケンス を使用して、コンソールへのテキスト出力に色を付けることができますこれらのシーケンスは、色を識別する一連のシンボルです。



例えば:



console.log('\x1b[33m%s\x1b[0m', 'hi!')


上記のコードをNode.js REPLに入力するhi!と、黄色なります。



考えられている方法はかなり面倒です。コンソール出力に色を付ける最も簡単な方法は、ライブラリを使用することです。これらのライブラリの1つはChalkで、色を定義するだけでなく、テキストを太字、斜体、または下線にすることができます。



npm install chalk使用してライブラリをインストールし、次のように使用します。



const chalk = require('chalk')
console.log(chalk.yellow('hi!'))


使用はchalk.yellow、複雑なシーケンスを記憶するよりもはるかに簡単です。また、コードが読みやすくなります。



プログレスバーを作成する


Progressは、ターミナルでプログレスバーを作成するための優れたライブラリです。でインストールしnpm install progressます。



このスニペットは、10ステップの進行状況バーを作成します。100 msごとに1つのステップが実行されます。インジケーターを埋めるとき、カウンターを無効にします:



const ProgressBar = require('progress')

const bar = new ProgressBar(':bar', { total: 10 })
const timer = setInterval(() => {
    bar.tick()
    if (bar.complete) clearInterval(timer)
}, 100)


ご静聴ありがとうございました。間違いやタイプミスを見つけた場合は、個人で書いてください。ありがとうございます。



つづく…



All Articles