Node.JSの最新のメジャーリリースは、更新されたJavaScriptエンジン、NPMバージョン5、GoogleのV8、Node.js API、ASYNC_HOOKS、ASYNC_HOOKS、WHATWG URLパーサ、より安全なバッファなどを含むJavaScriptコミュニティに多くの重要な改善をもたらします。ここでは、このリリースのこれらの機能とその他の最も重要な側面について更新します。
Node.js 8はコード名のカーボンの下でリリースされ、今から入手可能です。 Node.jsサイト 。メンテナンスモードに入る前に、それは積極的に18か月間(新機能、バグ修正、セキュリティの改善、およびNPMの更新)を積極的に取り組んでいます。以前のリリースと同様に、メンテナンスモードではリリースは重要なセキュリティ更新プログラムとバグ修正のみを受信します。
Node.jsが周りになって以来、これはランタイムが受け取った最大のアップデートの1つです - ネイティブアドオンがどのように書かれているかを変更し、さらにセキュリティとパフォーマンスの向上をもたらします。
立ち上がり トレーニング、コンサルティング、開発を備えた4年間、企業がNode.JSで成功しています。私たちが持っていた最大の闘いの1つは、プロジェクトにネイティブの依存関係を追加していました。
Node.js 8の前に、アプリケーションがネイティブコードを持つモジュールに依存していた場合、メジャーの新しいNode.jsバージョンが到着したときはいつでも、アプリケーションメンテナとして依存関係を再コンパイルしなければなりませんでした。あなたがラッキーだったら、彼らは最初に働いた。
このプロセスは、モジュールが互換性のないNode.jsバージョンを互いに動作させることになっている途方もない作業モジュールのメンテナが可能になりました。
このプロセスは、企業がコンパイルできなかった場合に依存関係が更新されず、モジュールメンテナに大きな追加のワークロードを入れることもできます。この問題を解決するために、Node.js API(またはN-API)が導入されました。
Node.js APIは、Node.js 8の最も重要な改善の1つです.Verlive.jsに明確に定義されたABI(アプリケーションバイナリインタフェース)を作成して、その仮想マシンをAnnosticにします。つまり、ネイティブモジュールは、GoogleのV8 JavaScript Engineを使用してさまざまなNode.jsバージョンで動作するだけでなく、MicrosoftのChakraも機能します。
今のところ、N-APIは実験的な状態にあり、重要な変更は実装とAPIの両方に起こる可能性があります。これにより、ネイティブモジュールメンテナは新しいインターフェースを試してフィードバックを与えることをお勧めします。
モジュールメンテナの場合は、メインモジュールバージョンと並行してN-APIバージョンをリリースできます。そのためには、公式の推奨事項は、N-APIタグを使用してModuleのバージョンをNPMに公開することです。
N-APIバージョンを公開するには、次のものがあります。
このようにして、N-APIのバージョンが最新のリリースにならないようにします。したがって、誰かがモジュールをインストールした場合は、デフォルトではN-API以外のバージョンが取得されます。
Facebookのエンジニアによって作成されたパッケージマネージャは、2016年10月にリリースされました。ほとんどの公的なNPMクライアントのいくつかの欠点に対処しようとしました。これらのイノベーションのほとんどは、NPM 5でも紹介されています。
ヤーンのように、NPM 5はロックファイルのメカニズムを導入しました - あなたがプロジェクトに新しい依存関係をインストールしているときはいつでも、それだけではなく自動的に追加されます Package.json. しかし、新しいファイルが呼び出されます Package-Lock.Json. 同じように。
あなたはその間の違いが何であるか尋ねるかもしれません Package-Lock.Json. そして npm-shrinkwrap.json. 、NPM-ShrinkWrapが永遠にNPMになっていますか?ロングストーリーショート、彼らは本質的に同じですが Package-Lock.Json. 自動的に作成されます。
彼らの目的は、依存関係ツリーNPMがあなたのパッケージにどのような依存関係を作成する必要があるかを説明することです。両方がある場合は、 NPM-ShrinkWrap 優先されます。 NPMの推薦に基づいて、あなたは使うべきです npm-shrinkwrap.json. あなたがそれを公開したいのなら、あなたのモジュールの消費者もそれを使うでしょう。一方、Package-lock.jsonを内部的に使用する必要があります - リポジトリにチェックされています。
しかし、NPM 5の改善はロックファイルを追加することで停止していません - 新しいバージョンでは、インストールしているすべてのモジュールも自動的に保存され、それらの両方が追加されます。 Package.json. そして Package-Lock.Json. ファイル。
NPMスクリプトが機能する方法もビットを変更しました。まず第一に、インストールされたスクリプトが他のすべての前に実行されるように、CLIが実際に読み取る前にnode_modulesディレクトリを変更することができます。これ以外にも、2つの新しいスクリプトが追加されました - PrepackとPostpack。それらは両方ともNPM PackとNPMの公開も実行されていますが、NPMのインストールでは実行されません。
Node.jsの中心部では、JavaScriptコードを解釈し、それからバイトコードを作成してアプリケーションを実行できるようにするJavaScriptエンジンです。新しいNode.js 8リリースでは、これも更新されました。
更新されたV8エンジンを使用すると、主要なパフォーマンスの向上が導入されました - しかし、もっと重要なことには、フォワード互換アプリケーションバイナリインタフェースを持つことが保証されています。つまり、node.jsがメジャーノード.jsリリースなしでV8エンジンを更新できることを意味します。
V8エンジンの新しいバージョンが新しいコンパイラパイプラインを導入するため、これは非常に重要です。これはNode.jsにさらなるパフォーマンスの向上をもたらします。このアップデートは、元のNode.js 8リリース日が延期された理由であるため、非常に重要でした。
現在のパイプラインは複雑すぎるか、新しい言語機能を導入することは通常、パイプラインの複数の部分に触れることを意味します。新しいパイプラインで、それは多くの単純化されます。
新しい最適化コンパイラである新しいインタプリタ、およびTurbofanは、約3年半の間開発されています。彼らは新しい言語の機能が築かれる基盤です。彼らは、Googleのv8チームが実生活の実際のJavaScriptアプリケーションの測定から収集された経験を含みます。
Asyncフックがどんな感想であるかをよりよく理解するために、一歩後退して、最初に継続ローカルストレージでグリップするようにしましょう。それらはスレッドローカルストレージがスレッドローカルストレージのように機能しますが、Node.jsではコールバックを使用してコンテキストを渡します。
データベースから製品を取得しているアプリケーションを書いていると想像してください。その後、HTMLレスポンスに送信します。
createNamespace =要求( '継続 - ローカルストレージ')。CreateNaMespace const session = createNamespace( 'my-app-session') const db = require( './ db.js') 関数OnRequest(オプション、次へ){ db.FetchUserById(options.id、関数(エラー・ユーザー){ if(エラー){ 次へ(エラー) } session.set( 'user'、ユーザー) 次() }後で、ユーザーオブジェクトにアクセスする場合は、ローカルストレージからそれをつかむだけです。
const getNamespace =要求( '継続 - ローカルストレージ')。getNamespace
const session = getNamespace( 'My Session')
const render =要求( './ render.js')
機能終了(応答){
const user = session.get( 'user')
render({user:user})。パイプ(応答)
この手法は、RisingStackによるトレースなどのアプリケーション性能監視プロバイダによって広く使用され、実行コンテキストを維持し、生産システムから監視情報を収集します。
ASYNCフックを使用すると、同様の機能がnode.jsコアに移動されます。これは、非同期リクエストとハンドラをライフサイクルを通じて追跡するのに役立ちます。 the async_hooks モジュールは、Node.jsアプリケーション内で作成された非同期リソースの有効期間を追跡するコールバックを登録するためのAPIを提供します。
Node.js 8の前に、約束を使用するアプリケーションでコアモジュールを使用したい場合は、コアモジュールを手動でラップして同じ方法で使用できるようにしてください。それはこのようなものに見えました:
const fs =要求( 'fs')
関数ReadFilePromise(... args){
新しい約束を返す((解決、拒否)= gt; {
fs.readfile(... args、(err、結果)=> {
if(err){
返品解決(err)
}
解決(結果)
)
)
}
ReadFilePromise( './ package.json'、 'utf-8')
.then((res)=> console.log(res))
.catch((ERR)= gt; console.log(err))
Node.js 8を使用すると、utilコアモジュールutil.promisifyに新しいヘルパーメソッドが追加されます。それは標準のnode.jsコールバックスタイルのAPIを約束を返す関数でラップされることを可能にします。
この機能を使用して、上記のスニペットが単純化されているがこれになります。
const fs = require( 'fs')
const promizify =要求( 'util')。際立って
READFILEPROMISE = PROMISIFY(FS.READFILE)
ReadFilePromise( './ package.json'、 'utf-8')
.then((res)=> console.log(res))
.catch((ERR)= gt; console.log(err))
node.jsバージョン8の前に、新しいバッファ(Number)コンストラクタを使用して割り当てられたバッファは、ゼロのメモリスペースを初期化しませんでした。その結果、新しいバッファインスタンスには機密情報を含めることができ、深刻なセキュリティ問題につながる可能性があります - Mongoose、WS、またはリクエストモジュールなどの一般的なモジュールでさえも影響を受けました。
しかし、私たちはどのようにそこに着いたのですか? JavaScriptがブラウザからサーバー側に移動されたときに、高速で簡単なデータ処理が必要でした。そのため、バッファクラスが追加されました。バッファはバイナリデータの可変配列です。新しいバッファのサイズを要求するコンストラクタと一緒に使用すると、メモリスペースを予約したが、それをきれいにしなかった。
サーバーが同時に複数のユーザーにサービスを提供できるように(ブラウザとは異なり)、さまざまな割り当てられたメモリスペースには、他のユーザー(パスワードでも)の機密情報が含まれており、攻撃者にさらされる可能性があります。
私たちのほとんどのために、新しいバッファーの創造のパフォーマンスを高める意図的な決断であるが、それが文書化されていたとしても意図された用途ではありませんでした。このため、node.js 8から始めて、新しいバッファ(数)またはバッファ(番号)を使用して割り当てられたバッファは自動的にゼロで埋められます。
Node.js 8の前に、node.jsアプリケーションをデバッグしたい場合、最も簡単な解決策の1つは、ノードデバッグを使用して組み込みデバッガを起動することでした。 index.js。 Node.js 8を使用すると、これは削除され、ノードインスペクタに置き換えられています。 CLIデバッガを使用することはできますが、まもなく削除されます。
これからは、ノードを使用する必要があります --inspect index.js. 、またはノード --inspect-brk index.js. デバッガにアプリケーションの最初の行にブレークポイントを入れるようにしたい場合。実行すると、Google Chromeがデバッガの接続に使用できるWebSocketリンクが表示されます。
あなたはに頭を向けてください Chrome://検査者 Chromeブラウザで、実行中のNode.jsアプリケーションを自動的に認識し、接続できます。プロセスに接続したら、Chromeのデバッガが実行中のNode.jsアプリケーションを検査するようになります。
以前は、実行時に受信したエラーを確認し、それに応じて行動したい場合は、ほとんどの場合、エラーメッセージを確認する必要がありました。エラーメッセージが新しいNode.jsバージョンで変更された可能性があるため、これはエラーが発生しやすいです。
node.js 8では、ほとんどのエラーに静的エラーコードが割り当てられています - それでも進行中の進行状況ですが、エラー内のメッセージが実行されていても、これらのエラーコードは変わりません。 。
たとえば、新しく導入されたものです Whatwg URL API 投げます err_invalid_url パラメータが有効なURLではないため、次のスニペットのエラーが発生しました。
const url =要求( 'URL')URL
const myurl =新しいURL( '/ foo')
ご覧のとおり、Node.js 8アップデートのリリースはJavaScriptコミュニティにたくさんの新しくてエキサイティングな改善をもたらしました。あなた自身のこれらすべての新しい機能を試し始めるために、 nodejs.org 、Node.js 8バイナリをダウンロードして、新しいツールセットで再生を開始します。
この記事は最初に登場しました ネットマガジン 問題296。 ここで購入してください 。
関連記事:
Blue ZooのBader Badruddinは3月13日に頂点になります。 Blue ZooはCG漫画の世界の星の1つであり、ここに�..
私のUnreal Engine 4プロジェクトを使用して最後の停止を例として、ビデオゲームの生産のためのリ..