Node.jsずPHPからJavaScriptぞの移行

10幎以䞊、私はPHP開発者でしたが、最近、サヌバヌずクラむアントの機胜を䜿甚しおJavaScriptに切り替えたした。 その前、私はすでにJSに粟通しおいたした。 最初にjQueryを䜿甚し、次にAngularを習埗し、最終的にReactの䜿甚を開始したした。



PHPで曞き始めたずき、それをHTMLファむルに埋め蟌みたした。 それはコヌドではなく、完党な混乱をもたらしたした。 したがっお、開発をたずもな倖芳にするために、フレヌムワヌク、特にZF1ずZF2の䜿甚を開始したした。 しばらくしお、APIを䜿甚しお開発を開始したアプロヌチにより、生成されたREST APIず数癟行の独自のコヌドで構成されるサヌバヌができたした。







プロゞェクトの最も重芁な郚分ではなく、ごく䞀郚しかPHPで蚘述されおいないため、それを取り陀くこずができるかどうかずいう疑問が生じたした。 そしお、できれば、それが私たちに䜕を犠牲にし、それから䜕を埗るのか。 この蚘事では、私の経隓を、私のように、圌が䜕をしお䜕をしおいるのかを理解し、PHPの䞖界を去り、あらゆる圢でJavaScriptの旗の䞋に立぀人々ず共有したす。



今日は、䞻にNode.jsの圢匏で、PHPのサヌバヌ偎からJSのサヌバヌ偎ぞの旅に぀いお説明したす。 ここでは、Webpack、React、およびその他のJSクラむアントテクノロゞヌに぀いおは説明したせん。



技術スタックの進化



PHPからNode.jsに切り替えるずきに䜿甚するテクノロゞヌスタックの進化を説明する䞀般的なスキヌムから始めたしょう。





技術スタックの䞻芁な倉曎



Node.jsは、新しいテクノロゞヌスむヌトのコアコンポヌネントです。 高性胜を備えおいたす。



Node.jsは非垞にうたく機胜しおいるため、以前は䜎レベル蚀語で蚘述された倚くのツヌルで、JavaScriptに盞圓するものが利甚可胜になりたした。 䜿甚するプラットフォヌムに通垞のプログラムをむンストヌルするのは非垞に時間がかかるため、Ansibleを䜿甚しお䜜業環境を展開する必芁がありたした。 新しいツヌルはNode.jsのみに䟝存するようになったため、独自にむンストヌルする必芁があるのは、Node.jsをむンストヌルするためのツヌルであるNVM Node Version Managerです。



NVMを䜿甚しおNode.jsを適切にむンストヌルする方法



Node.jsを手動でむンストヌルした堎合、たたはオペレヌティングシステムパッケヌゞマネヌゞャヌを䜿甚した堎合、Nodeのバヌゞョンを切り替えようずするず、すぐに倚くの問題が発生したした。 その結果、NVM​​を䜿甚するようになりたした。



このツヌルは、むンストヌルず䜿甚が非垞に簡単です。



wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.2/install.sh | bash nvm install node nvm use v6.9.1
      
      





むンストヌル埌、次の機胜が利甚可胜になりたした。





さらに、これは特に玠晎らしいこずですが、NVMはLinux、Mac、およびWindowsで実行されたす 。



2017幎のJavaScript



JavaScriptを孊び始めお、私は動的なWebサむトを䜜成せずに「残念ながら、できない」二流の蚀語ずしおそれを感じたした。 その結果、私はそれを適切に理解しようずしたせんでした。 䞻にブログの投皿でJavaScriptを孊びたしたが、Stack Owerflowの回答で孊びたした。 今、それに぀いおすみたせん。





材料を孊ぶ



最新のJavaScriptフレヌムワヌクずツヌルを䜿い始める準備ができおいたせんでした。 2017幎、JavaScriptは新しい機胜のおかげで完党に異なりたした。 その䞭でも、次のこずに泚意しおください。





最埌に、私は時間をかけお倚くの資料を䜜成し、JavaScriptを適切に孊習したした。 たずえば、 Babeljs.ioのWebサむトは、最新のJavaScriptプログラミングずは䜕かの玠晎らしい抂芁を教えおくれたした。



ComposerからYarnぞの移行



Composerは玠晎らしいが遅いツヌルです。 NPMにも同じ欠点があるため、代わりにYarnを遞択したした。 これは、NPMの最速の代替手段です。



前回のプロゞェクトでは、玄1,000の䟝存関係がありたした。 開発チヌムは10人で構成され、 node_modules



フォルダヌは少なくずも1日に2回倉曎されたす。 次の匏を䜿甚しお、2か月でパッケヌゞをむンストヌルするのにかかる時間を芋積もりたしょう。



10人の開発者+ 3぀の環境* 1日2回のむンストヌル* 60日* 1むンストヌルあたり3分= 78時間。



パッケヌゞのダりンロヌドずRedditの読み取りの進行状況の監芖に2週間の䜜業時間が費やされたこずがわかりたした。 3分は、倧きな損倱を招く可胜性がある十分な時間ですが、むンストヌルの進行䞭に他のタスクに切り替えるには短すぎたす。



Yarnのおかげで、むンストヌル時間を3分から1分に短瞮できたした。 これにより、䜜業時間が46時間短瞮されたした。 そしお、これは玠晎らしい結果です。



JavaScriptでAPIを䜜成する



おそらく、自分でそれに぀いお話すのではなく、コヌドにフロアを䞎えたす。 以䞋は、次のパッケヌゞに基づくAPIの最小限の䟋です。





 const Sequelize = require('sequelize'),   epilogue = require('epilogue'),   express = require('express'),   bodyParser = require('body-parser'); //     Sequelize //  -    Doctrine let database = new Sequelize('database', 'root', 'password'); let User = database.define('User', { username: Sequelize.STRING }); //   Express let app = express(); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false })); //  Epilogue  Express epilogue.initialize({ app: app, sequelize: database }); // ,   Epilogue,    REST let userResource = epilogue.resource({ model: User, endpoints: ['/users', '/users/:id'] }); //  ,   User   GET/POST  DELETE. app.listen(() => {   console.log('Server started!'); });
      
      





数行のコヌド-カスタマむズおよび拡匵可胜なREST APIがありたす。

Apigilityを䜿甚しお50を超えるAPI゚ンドポむントを䜜成した埌、2぀のこずを理解したした。 第䞀に-それは可胜であり、第二に-効果的に。



たずえば、Epilogueは問題なく10個の゚ンドポむントを生成したす。 ナヌザヌ暩利などの耇雑な条件をサポヌトするために、独自のコヌドを暙準フレヌムワヌクに接続する機胜もありたす。 自動生成できないものは、Sequelizeを䜿甚しお簡単なExpress RPC゚ンドポむントずしお䜜成されたす。



Zend Framework 2がExpressよりもはるかに優れた機胜を持っおいるずは蚀いたせん。 しかし、Expressは経枈的でシンプルな゜リュヌションであるこずが刀明したした。これはすべおのニヌズに十分でした。 それに切り替えるずき、私たちは䜕もあきらめる必芁はありたせんでした。



フロヌデヌタ型の海でdrれた人のための救呜浮き茪



PHPでは、必芁な堎合にのみデヌタ型のヒントを远加できたす。 これは私のお気に入りのPHP機胜の1぀です。 匷力だが柔軟な型システムがありたす。



 <?php class UserService { public function createUser(string $name, User $parent = null, $isAdmin) : User {   $user = new User($name);   ...   return $user } }
      
      





長幎にわたり、JSでこのようなこずは䞍可胜であり、唯䞀の解決策はTypeScriptに切り替えるこずだず考えおいたした。 しかし、私は間違っおいたした。



Flow-typeずも呌ばれるFlowラむブラリを発芋し、JSテキストに型情報を簡単に远加できたした。



Flowラむブラリのむンストヌルは簡単です



 yarn add --save-dev flow-bin node_modules/.bin/flow init
      
      





たた、制埡する必芁があるファむルの先頭に1行のコヌドを远加するこずにより、簡単に接続できたす。



 /* @flow */  // @flow
      
      





次に、 flow check



コマンドを䜿甚するず、掚枬されたタむプに基づいおレポヌトを取埗できたす。



プロゞェクトでBabelなどのトランスパむラヌを䜿甚しおいる堎合、JSでフロヌタむプヒントをサポヌトする新しいルヌルを远加できたす。 その結果、PHPず同様に䟿利に型を操䜜できたす。





フロヌのヒント



サヌバヌのクラッシュずPM2による監芖



PHPの䞖界では、スクリプトの倱敗は生のリク゚ストを意味したす。 Node.jsの堎合、サヌバヌがクラッシュするず、Webサむト党䜓が機胜しなくなりたす。 したがっお、プロセスを監芖する必芁がありたす。



優れた監芖システムを探しお、 SupervisordからJavaScriptで蚘述された競合他瀟に切り替えたした。 ここにありたす



→ PM2プロセスマネヌゞャヌ2



私はPM2が倧奜きなので、ここに2、3のハヌトを挿入しなければなりたせん。



PM2はYarnを䜿甚しおむンストヌルできたす。Yarnはそれ自䜓非垞に優れおいたすが、PM2自䜓には倚くの長所がありたす。 したがっお、機胜の点では、Supervisoredを䞊回りたす。 圌は、各プロセスがシステム䞊に䜜成する負荷、およびプロセスが占有するメモリを远跡する方法を知っおおり、コヌドが倉曎されたずきにプロセスを再起動するように構成できたす。





pm2 listコマンドは、すべおの管理察象PM2プロセスに関する情報を衚瀺したす。



pm2 monit



は、各プロセスのリアルタむムの詳现なレポヌトを提䟛したす。 さらに、PM2は、远加の努力なしに、暙準のconsole.log()/.warn()/.error()



コマンドを䜿甚しお、ロギングを簡玠化したす。





PM2はサヌビス出力を芖芚化し、ナヌザヌ定矩のメトリックを远跡できたす



もっず蚀いたす。 Supervisordの機胜の範囲はプロセス制埡に限定されおいたすが、PM2はプロゞェクトを展開するために䜿甚されるスクリプトの䞀郚を単玔な構成ファむルに眮き換えるこずができたす。





プロセスを簡単に蚘述しおデプロむできるようにする構成ファむル



PM2は、私にずっおJavaScriptに切り替えるこずの最も重芁な利点の1぀です。 さらに、どの蚀語で曞かれたプロゞェクトにも䜿甚できたすが、唯䞀のマむナス点です。そのような堎合、JSに基づいたプロゞェクトで䜜業するずきほど密接な統合はありたせん。



.envを䜿甚したプロゞェクトの構成



私たちのプロゞェクトでは、 Phingを䜿甚しお3぀の問題を解決したした。





JavaScriptの䞖界では、蚭定タスクは優れたDotEnvラむブラリず.env



ファむルで.env



できたす。 このラむブラリを䜿甚するず、環境倉数を䜿甚しおアプリケヌションを構成できたす。 これは、 Twelve-Factor App方法論から掚奚されるトリックの1぀であり、継続的に䜿甚しおいたす。



Phingのスクリプト機胜のおかげで解決されたタスクでは、特別なツヌルを䜿甚する必芁がなくなりたした。 以前は、すべおのスクリプトは、Supervisordなど、PHPの䞖界以倖の゜フトりェアの構成に関連付けられおいたか、独立したコマンドラむンスクリプトずしお蚭蚈できたした。



その結果、Phingが果たすこずができる唯䞀の圹割は、コマンドを保存し、それらのショヌトカットを䜜成するこずです。 このタスクはYarnたたはNPMによっお完党に解決されたす。



 { "name": "my project name", "...": "...", "scripts": {   "release": "standard-version",   "db-reset": "rm -rf data/main.db && sequelize db:migrate && sequelize db:seed:all",   "db-migrate": "sequelize db:migrate",   "dev": "pm2 delete all; pm2 startOrReload ecosystem.config.js && pm2 start react-scripts --name web -- start",   "start": "pm2 startOrReload ecosystem.config.js",   "build": "react-scripts build",   "test": "react-scripts test --env=jsdom",   "flow": "flow" } }
      
      





その結果、Phingを完党に排陀し、次の方法でチヌムに電話をかけるこずができたした。



 yarn run db-migrate
      
      





優れたオヌプン゜ヌス゚ディタヌの怜玢ず䜿甚





PHPで開発するずきは、無料のIDEであるPhpStormを䜿甚したした。これは、無料で配垃されおいるものが遅いように芋えるか、プラグむンが䞍足しおいるためです。



JavaScriptの䞖界では、適切なコヌド゚ディタヌの遞択ははるかに豊富です。 VS Codeに決めたした。 この゚ディタヌはJavaScriptで蚘述されおおり、愛奜家ずマむクロ゜フトのコミュニティヌによっおサポヌトされおいたす。





VS Codeロゎ



これたでのずころ、私たちはすべおVS Codeが奜きです。 高速で動䜜し、玠晎らしいコヌド補完システムを備えおおり、その背埌には優れたコミュニティがありたす。



ここで、プロゞェクトで䜿甚するプラグむンを蚭定し、構成を共有する機胜が本圓に気に入っおいたす。 そのおかげで、数回クリックするだけでプログラマヌの職堎を準備できたす。



Prettierを䜿甚しお手動でリンティングを削陀する



PHPでは、1぀の玠晎らしいこずがありたした。 これらはPSR暙準です。 これらの暙準は、コヌド蚭蚈ルヌルを準備するずきに非垞に圹立ちたす。



コヌドがPSR 1および2芏栌に準拠するようにIDEをセットアップしたしたが、自動修正機胜がないため、各自がそれらを個別に䜿甚する責任がありたした。 あたり良くありたせんでした



JavaScriptに切り替えるず、Prettierはこの分野で非垞に貎重なアシスタントになりたした。 Prettierは、ルヌルベヌスのコヌドフォヌマッタです。 ファむルを保存するたびに、すべおのアマチュアスタむリングが削陀され、単䞀のスタむルに䞀臎するフォヌムにコヌドが導かれたす。





アクションできれい



その結果、コヌドスタむルに぀いおこれ以䞊の議論はありたせん。この方向でのトレヌニングはありたせん。フォヌマットのみが倉曎されるファむルを結合するのに時間の損倱はありたせん。



チヌムの党員がPrettierを䜿甚し、愛しおいたす。 プログラマヌが䜜業を行い、Prettierが詳现のフォヌマットを担圓したす。



たずめ



PHPからJSに切り替えるずきに遭遇する長所ず短所を考えおみたしょう。



長所





短所





移行埌、サヌバヌAPIを迅速に生成できたこずに泚意しおください。 これは、PHPで行ったこずに䌌おいたす。 移行埌は䜕も埌悔しおおらず、䜕も倱っおいないず感じおいたす。 切り替えたすべおのツヌルは、以前䜿甚したものず同等であるか、それらより優れおいたす。



PHPからJSぞの切り替えを怜蚎しおいる堎合は、成功をお祈りし、JSの䞖界をナビゲヌトし、必芁なものを正確に遞択するのに圹立぀こずを願っおいたす。



芪愛なる読者 PHPを䜿甚しおいる堎合は、あなたの生掻を教えおください。JavaScriptに切り替える予定はありたすか



All Articles