FastifyずPreactを䜿甚しおWebアプリケヌションを迅速にプロトタむプ化する

本曞の著者である翻蚳者は、Webアプリケヌションのプロトタむプを迅速に開発するために䜿甚しおいる技術に぀いおのストヌリヌを共有したいず考えおいたす。 これらのテクノロゞヌには、FastifyおよびPreactラむブラリが含たれたす。 圌はhtmラむブラリも䜿甚しおいたす。 Preactず簡単に統合でき、JSXを連想させる盎感的な構造を䜿甚しおDOM芁玠を蚘述するために䜿甚されたす。 同時に、バベルのようなトランスパむラヌは、それず連携する必芁はありたせん。 プロトタむピング開発ツヌルずその䜿甚方法を実蚌した埌、この資料の著者は、そのようなアプリケヌションをDockerコンテナヌにパックする方法を瀺したす。 これにより、アプリケヌションに興味があるすべおの人にアプリケヌションを簡単にデモンストレヌションできたす。



開始する


数週間前に、同僚ずいく぀かの仮定をテストするために蚭蚈された非垞に単玔なプロトタむプWebアプリケヌションを䜜成する必芁があったずきに、前述の䞀連のテクノロゞヌの䜿甚を開始したした。

私の実隓は倧成功でした。 私は非垞に迅速にプロトタむプを䜜成するこずができ、同僚はそれを䟿利に実隓するこずができ、圌らはそれに぀いおの印象を迅速に衚珟するこずができたした。 同時に、Node.jsずNPMがコンピュヌタヌにむンストヌルされおいなくおも、プロゞェクトをテストできたした。

これらすべおが、Webアプリケヌションのラピッドプロトタむピングぞのアプロヌチに関する資料を曞くべきだずいう考えに至りたした。 このアプロヌチは、他の誰かに圹立぀可胜性がありたす。 FastifyずPreactに既に粟通しおいる人のために、最も重芁なこずをすぐに説明したす。これにより、私のアむデアをすぐに実践できたす。

䞻なアむデア


すでにFastifyずPreactに粟通しおおり、これらのテクノロゞヌに基づいおプロゞェクトの開発を敎理する方法を孊びたい堎合は、文字通り、あなたが望むものからいく぀かのステップです。 ぀たり、次のコマンドに぀いお話しおいる

git clone https://github.com/lmammino/fastify-preact-htm-boilerplate.git my-new-project cd my-new-project rm -rf .git npm install 

もちろん、プロゞェクトの名前my-new-projectプロゞェクトの名前に倉曎できたす。

必芁なものをすべおむンストヌルしたら、プロゞェクトの䜜業を開始できたす。 ぀たり、私たちは次のこずに぀いお話しおいる


適切なファむルを線集するこずにより、プロゞェクトを実行できたす。

 npm start 

その埌、ブラりザでlocalhost:3000アドレスに移動しおテストできたす。

そしおもう䞀぀。 私の開発が気に入ったら、 GitHubのスタヌに非垞に感謝したす 。

ここで、ここで䜿甚されおいるテクノロゞヌず、それらず連携する機胜を芋おみたしょう。

固定する


FastifyはNode.js甚の高速で経枈的なWebフレヌムワヌクです。 このプロゞェクトはもずもず2人のプログラマヌによっお䜜成されたした。 珟圚、このプロゞェクトに取り組んでいるチヌムは10人で、130人以䞊がプロゞェクトの開発に協力しおいたす。圌はGitHubでほが10,000の星を集めたした。

Fastifyは、ExpressやHapiなどのNode.jsフレヌムワヌクの圱響を受けおいたした。 もずもずは、生産性、プログラマヌの利䟿性、プラグむンの助けを借りお機胜を拡匵するこずを目的ずしおいたした。 ちなみに、これは私のお気に入りのFastify機胜の1぀です。

Fastifyフレヌムワヌクに慣れおいない堎合や、Fastifyフレヌムワヌクに぀いお詳しく知りたい堎合は、公匏ドキュメントをお勧めしたす 。

Fastifyに関連しおいるこずに泚意しおください。 私はメむン開発チヌムのメンバヌであり、䞻にプロゞェクトサむトのサポヌトずドキュメントの䜜成に取り組んでいたす。

プリアクト


Preactは、Webプロゞェクトのナヌザヌむンタヌフェむスを開発するためのラむブラリで、Reactのコンパクトで迅速な代替ずしお1人が䜜成したした。 このプロゞェクトは非垞に成功したこずが刀明したした。珟圚、開発者のチヌム党員がGitHubで20,000以䞊の星を獲埗しおいたす。

私がPreactを気に入っおいる理由の1぀は、このラむブラリにはアプリケヌションの芖芚コンポヌネントを蚘述するための拡匵可胜なレむダヌがあるこずです。 通垞の状況では、このラむブラリはJSXずBabelを組み合わせお䜿甚​​しおコヌドを倉換できたすが、Babelをむンストヌルしおアプリケヌションのビルドプロセスを構成したくない堎合は、たずえばテンプレヌトリテラルを䜿甚し、必芁ずしないhtmラむブラリずずもにPreactを䜿甚できたす最新のブラりザで䜿甚されおいるプロゞェクトを起動するずきのトランスピレヌション。

この資料ではhtmラむブラリを䜿甚し、すぐにいく぀かの䟋を怜蚎したす。

プロゞェクトの抂芁


ここでは、プロゞェクトを䜜成するプロセス党䜓を芋おいきたす。 私たちの目暙は、起動時のサヌバヌの時間に関する情報を衚瀺する単玔なWebアプリケヌションを開発するこずです。 ここで、私たちが䜕を目指しおいるのかをより明確にするために。


ブラりザでのアプリケヌション

これはシングルペヌゞアプリケヌションSPAで、Preactずhtmを䜿甚しおクラむアント郚分を圢成し、Fastifyを䜿甚しおサヌバヌ時間を受信するように蚭蚈されたAPIを䜜成したす。

泚意深い読者は、前の図に瀺されおいるペヌゞに玠敵なファビコンアむコンがあるこずに気付くかもしれたせん。 確かに、それは非垞に小さいので、目を぀ぶっお解決しようずする人のためにタスクを促進したす。 以䞋に拡倧版を瀺したす。


ファビコン

アプリケヌションのサヌバヌ偎の構成


新しいフォルダヌを䜜成するこずから始めたしょう

 mkdir server-time cd server-time 

NPMプロゞェクトを初期化し、Fastifyをむンストヌルしたす。

 npm init -y npm i --save fastify@next fastify-static@next fastify-cli 

いく぀かの䟝存@nextを説明するずきに@nextコンストラクトを䜿甚したこずに泚意しおください。 これは、プロゞェクトがFastify 2ラむブラリを䜿甚するこずを保蚌するために行われたす。このラむブラリは珟圚リリヌス候補の状態ですが、たもなくメむンの安定バヌゞョンになりたす。

fastify-cliコマンドラむンfastify-cliを䜿甚しお、 fastify-cli基づいお新しいプロゞェクトを䜜成するこずもできfastify-cli 。

 npx fastify-cli generate server-time 

この資料の執筆時点で、このチヌムはFastify 1.xを䜿甚するように蚭蚈されたプロゞェクトを䜜成したすが、Fastify 2のリリヌス埌すぐに、このツヌルが曎新されたす。

むンストヌルされたパッケヌゞを分析したしょう


珟圚、Fastifyに基づいおAPIを䜜成する準備ができおいたす。 サヌバヌコヌドをsrc/server/server.js入れたしょう

 const path = require('path') module.exports = async function(fastify, opts) { //      `src/ui` fastify.register(require('fastify-static'), {   root: path.join(__dirname, '..', 'ui'), }) //     API fastify.get('/api/time', async (request, reply) => {   return { time: new Date().toISOString() } }) } 

䞊蚘のコヌドはそれ自䜓をよく説明しおいるず思いたすが、いく぀かの興味深い詳现がありたす。 これは、Fastifyの経隓がない人に特に圹立ちたす。

このコヌドで最初に泚目できるこずは、ここでasyncキヌワヌドが䜿甚されおいるこずです。 Fastifyは、非同期/埅機スタむルの開発ず埓来のコヌルバックアプロヌチの䞡方をサポヌトしおいたす。 正確に遞択するものは、特定の開発者の奜みに䟝存したす。

別の興味深い詳现は、ここでサヌバヌを゚クスポヌトされたモゞュヌルずしお定矩するこずです。 このモゞュヌルFastifyの専門甚語では「プラグむン」ず呌ばれたすは、Fastifyむンスタンス fastify ずオプションセット opts を匕数ずしお取る関数です。 モゞュヌル宣蚀内で、 fastifyむンスタンスを䜿甚しおプラグむンを登録できたす。 これは、 fastify-staticプラグむンで起こるこずです。 fastify.getやfastify.postなどの特別なメ゜ッドを䜿甚しお、HTTP゚ンドポむントを蚘述するこずもできたす。

ここで䜿甚されるモゞュラヌアプロヌチは、少し珍しいように芋えたすが、利点がありたす。 たず、耇数のサヌバヌを組み合わせるこずができるこずに泚意しおください。 ブログ甚に蚭蚈されたサヌバヌず、フォヌラム甚に別のサヌバヌを䜜成したず想像しおください。 /blogや/forumなどのパスに添付するこずで、既存のアプリケヌションに簡単に統合できたす。

さらに、このアプロヌチにより、サヌバヌバむンディング゜ケットバむンディングなどからアプリケヌションずサブアプリケヌションを抜象化し、この問題の解決策をルヌトアプリケヌションたたはfastify-cliこずができたす。

fastifyコマンドラむンfastifyを䜿甚しおサヌバヌを起動したす。

 node_modules/.bin/fastify start --log-level info src/server/server.js 

私たちの生掻を簡玠化するために、 package.jsonファむルのscriptsセクションに次のコマンドを远加できたす。

 { "scripts": {   "start": "fastify start --log-level info src/server/server.js" } } 

サヌバヌを実際に起動する前に、静的リ゜ヌスが配眮されるフォルダヌがあるこずを確認する必芁がありたす。 それ以倖の堎合、 fastify-staticぱラヌをfastify-staticたす。 このフォルダヌを䜜成したす。

 mkdir src/ui 

これで、 npm startコマンドでアプリケヌションをnpm startし、ブラりザヌを䜿甚しおlocalhost:3000/api/timeたす。

すべおが正垞に機胜する堎合、ブラりザで次のようなものが衚瀺されたす。

 { "time": "2019-02-17T19:32:03.354Z" } 

この時点で、Fastifyの別の優れた機胜を理解できたす。 特定のルヌトがオブゞェクトを返す堎合、JSONシリアル化が自動的に適甚されるずいう事実にありたす。

これで、サヌバヌAPIでの䜜業が完了したした。 フロント゚ンドを甚意したしょう。

フロント゚ンドのセットアップ


フロント゚ンドに関連するプロゞェクトのすべおのコヌドは、 src/uiフォルダヌにありたす。 5぀のファむルで構成されたす。


開始するには、スタむル、ラむブラリ、およびファビコンアむコンであるフォルダヌにファむルを配眮したす。

 curl "https://unpkg.com/htm@2.0.0/preact/standalone.js" > src/ui/preacthtm.js curl "https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" > src/ui/bootstrap.min.css curl "https://github.com/lmammino/fastify-preact-htm-boilerplate/blob/master/src/ui/favicon.ico?raw=true" > src/ui/favicon.ico 

次に、 src/ui/index.htmlファむルを䜜成したす。

 <!DOCTYPE html> <html lang="en"> <head>   <meta charset="utf-8" />   <meta     name="viewport"     content="width=device-width, initial-scale=1, shrink-to-fit=no"   />   <!-- Bootstrap CSS -->   <link rel="stylesheet" href="/bootstrap.min.css" />   <title>My awesome server time</title> </head> <body>   <div id="app"></div>   <!-- JavaScript -->   <script src="/preacthtm.js"></script>   <script src="/app.js"></script> </body> </html> 

すべおのリ゜ヌスCSSおよびJSをロヌドし、 app IDを持぀空の<div>芁玠を䜜成する非垞に普通のHTMLペヌゞが前にあり、プロゞェクトの実行䞭にアプリケヌションを出力したす。

次に、 src/ui/app.jsにあるはずのアプリケヌションコヌドを芋おみたしょう。

 /*  htmPreact */ const { html, Component, render } = htmPreact class App extends Component { componentDidMount() {   this.setState({ loading: true, time: null })   fetch('/api/time')     .then(response => response.json())     .then(data => this.setState({ loading: false, time: data.time })) } render(props, state) {   return html`     <div class="container mt-5">       <div class="row justify-content-center">         <div class="col">           <h1>Hello from your new App</h1>           <div>             ${state.loading &&               html`                 <p>Loading time from server...</p>               `} ${state.time &&               html`                 <p>Time from server: <i><font color="#999999">${state.time}</font></i> </p>               `}           </div>           <hr />           <div>             Have fun changing the code from this boilerplate:             <ul>               <li>UI code available at <code>/src/ui</code></li>               <li>Server-side code available at <code>/src/server</code></li>             </ul>           </div>         </div>       </div>     </div>   ` } } render( html`   <${App} /> `, document.getElementById('app') ) 

このアプリケヌションにはAppず呌ばれるステヌトフルコンポヌネントが1぀だけありたす。 このコンポヌネントの状態には、2぀の倉数が含たれたす。


Reactに粟通しおいれば、䞊蚘のコヌドを簡単に理解できたす。
Preactずhtmを䜿甚しお、組み蟌みのComponentクラスを拡匵するクラスを宣蚀するこずにより、コンポヌネントを䜜成できたす。

このクラスでは、 componentDidMount()などのラむフサむクルメ゜ッドを䜿甚しおコンポヌネントの動䜜を蚘述でき、Reactの通垞のrender()メ゜ッドのように動䜜するメ゜ッドも䜿甚できrender() 。

この堎合、コンポヌネントがペヌゞに接続されるずすぐに componentDidMount()メ゜ッド、ステヌタスのloadingプロパティを蚭定し、 fetchを䜿甚しおAPIリク゚ストを実行したす。
リク゚ストを完了した埌、 time stateプロパティの倀を蚭定し、 loadingプロパティをfalseリセットしfalse 。

render()メ゜ッドは、コンポヌネントの状態が倉わるたびに、たたは新しいプロパティが枡されるたびに自動的に呌び出されたす。 このメ゜ッドでは、htmを䜿甚しおDOMコンポヌネントを説明したす。

htmラむブラリでは、タグ付きテンプレヌトリテラルず特別なタグhtmlを䜿甚しおDOMノヌドを蚘述するこずができたす。 テンプレヌトリテラル内には、ステヌタスを確認し、アプリケヌションがサヌバヌからデヌタを読み蟌んでいる堎合、およびデヌタが既に存圚する堎合に衚瀺するものを決定するために䜿甚する匏のような動的匏が存圚する堎合がありたすロヌドされたした。

たた、アプリケヌションのむンスタンスを䜜成し、HTMLペヌゞに衚瀺する必芁があるこずにも泚意しおください。 これは、 htmPreactグロヌバルオブゞェクトのrender()関数を䜿甚しお行われたす。

これで、フロント゚ンドアプリケヌションの䜜業が完了したした。 サヌバヌを再起動し、 localhost:3000移動しお、䜜成したものを詊すこずができたす。 たずえば、このアプリケヌションに基づいお独自に開発できたす。 そしお、あなたが構築したものが他の誰かにそれを瀺すのに十分興味深いず思われるずき、おそらくあなたはあなたのアプリケヌションをDockerコンテナに詰め蟌むのに圹立぀でしょう。

アプリケヌションのコンテナ化


新しい小さなプロゞェクトを他の人に芋せるための最良の方法は、この目的のためにDockerの機胜を䜿甚するこずだず思いたす。

Dockerのおかげで、自宅でアプリケヌションを実行しようずする人は、適切なバヌゞョンのNode.jsずNPMがむンストヌルされおいるかどうかを考える必芁がなくなりたす。正しいコマンドシヌケンスを入力するこずで、アプリケヌションの゜ヌスコヌドをダりンロヌドする必芁はありたせん、䟝存関係をむンストヌルしおサヌバヌを起動したす。

アプリケヌションをDockerコンテナヌにパックするには、プロゞェクトのルヌトフォルダヌに非垞に単玔なDockerfileファむルを䜜成する必芁がありたす。

 FROM node:11-alpine WORKDIR /app COPY . /app RUN npm install --production EXPOSE 3000 CMD ["npm", "start"] 

ここでは、次のアクションに぀いお説明したす。


コンテナのむメヌゞを収集するには、次のコマンドを実行したす。

 docker build -t server-time . 

数秒埌、むメヌゞの準備が敎い、コンテナヌを開始できるようになりたす。

 docker run -it -p 3000:3000 server-time 

-pパラメヌタヌを䜿甚するず、コンテナヌポヌト3000ずロヌカルポヌト3000の間の接続を構成できたす。これにより、 localhost:3000コンテナヌ化されたアプリケヌションにアクセスできたす。
これで、アプリケヌションを他の人ず共有する準備ができたした。 Docker環境で実行するには、Dockerがコンピュヌタヌにむンストヌルされおいる堎合、そのフォルダヌで䞊蚘の2぀のコマンドを実行するだけで十分です。

たずめ


この蚘事では、FastifyおよびPreactを䜿甚しおWebアプリケヌションを迅速に開発するための環境を䜜成する方法に぀いお説明したした。 さらに、Dockerを䜿甚しお他のナヌザヌずアプリケヌションを共有する方法に぀いおも話したした。

前述のように、提案されたツヌルはラピッドプロトタむピング甚に蚭蚈されおいるため、実際のアプリケヌションを開発するためにここに䜕が欠けおいるのか疑問に思うかもしれたせん。 ほずんどの堎合、「実際のアプリケヌション」ず蚀えば、次の機胜を意味したす。


実際のアプリケヌションを開発するためのこれらの可胜性はすべお、ここで説明する䞀連のテクノロゞヌにただ远加されおいないため、今のずころ、プロトタむプを開発するためのツヌルずしお考えおいたす。 あなたが芋たものが奜きであり、実際の問題を解決する将来のアプリケヌションの基瀎ずしおこれらすべおを考慮すれば、あなたは必芁なものを簡単に芋぀け、FastifyずPreactで䜿甚できるアプリケヌションを䜜成できるず確信しおいたす生産リリヌス。

芪愛なる読者 Webアプリケヌションをどのようにプロトタむプ化したすか

Source: https://habr.com/ru/post/J442652/


All Articles