bem-expressでサヌバヌ偎に枡したす

「たず圌を吊定し、次に圌を憎み、そしお圌なしでは生きられない」
Artyom Kurbatovのレポヌト「BEMmaster class」から


BEM方法論はかなり前から存圚しおおり、Google、EPAM Systems、BBC、Alfa Bankで採甚されおいたす。 ただし、通垞の䞭間レベルの開発者およびプロゞェクトマネヌゞャヌの間では䟝然ずしお懞念が生じたす。




䞀郚の向こう芋ずな人にずっお、BEMの研究は、より予枬可胜な結果を​​埗るためにCSSの限界を超えおいたせん。 BEMはレむアりトをはるかに超えおいたすが、「BEMを知っおいたすか」ずいう質問を聞くこずができたす。「もちろん、これはクラスで䞋線を匕くこずです。」


BEMのアむデアがこれに近い堎合、新卒の卒業生を雇甚する際に雇甚䞻の蚀葉で答えたす。「以前BEMに぀いお聞いたこずを忘れおください」。 BEM方法論は、ほずんどが䜕も知らないのず同じくらい興味深いものです。 BEMの矎しさを理解するには、BEMが提䟛するすべおのテクノロゞヌ、ラむブラリ、フレヌムワヌク、およびツヌルのアむデアが必芁です。 それらを研究し、倖囜人であり続け、倧人が䜕に察凊しおきたのか疑問に思う子䟛です。


目次



私にずっおのBEMずは䜕ですか


ガレヌゞで閉じた倧胆なオタクが別のスタヌトアップを発明した方法の話を聞いたこずは間違いありたせん。 最初の成功により、圌らは投資を呌び蟌み、驚くべき補品で垂堎に参入するこずができたした。 圌らはどのように成功し、どのようにしおピヌク負荷に耐え、氞続的なリファクタリングで行き詰たるこずはありたせんでしたか 通垞ではなく、どのように必芁ですか


BEMは、スタヌトアップのラむフハックです。 他の倚くのフレヌムワヌクやテクノロゞヌず比范しお、BEMの䜿甚を開始するには倚少の努力が必芁ですが、持続可胜な拡匵性を提䟛するアヌキテクチャが埗られたす。 すべおのBEMテクノロゞヌ、フレヌムワヌク、およびラむブラリには、最初に宣蚀的アプロヌチの原則が組み蟌たれおいたす。 そしお、これは圌らを䞀芋しお理解しにくくし、最終的に愛するものです。


この蚘事を読んだ埌は、BEM Zenを理解するこずはできたせんが、CSSだけでなく本栌的な動的BEMプロゞェクトを䜜成する方法を孊んだ倧人に間違いなく答えるこずができたす。 たた、明日、アプリケヌションが1日あたり+10 Kナヌザヌずいう運呜に陥った堎合、萜ち着いおください。このむベントを祝う時間があるでしょう。


今日は、動的なbem-expressプロゞェクトの新しいテンプレヌトリポゞトリに぀いお説明したす。これにより、BEMプロゞェクトをワンクリックでデプロむできるだけでなく、プロゞェクトを自動的に再構築し、ブラりザをリロヌドできたす。 それに基づいお、動的アプリケヌションを開発し、さたざたなBEMテクノロゞヌの盞互䜜甚プロセスを説明したす。 「クラスで䞋線を匕く」運呜を回避するために、レむアりトずクラむアント偎のJavaScriptの問題を意識的に怜蚎するこずはありたせん。


䜕を開発したすか


゜ヌシャルサヌビス怜玢ロボット略しおSSSR。リク゚ストに応じお、YouTubeからの最新のツむヌトやビデオを衚瀺したす。


以䞋を䜿甚したす。



最初にむンストヌルする必芁がありたす



重芁 Windowsナヌザヌは、 Git Bashを远加でむンストヌルする必芁がありたす。

䜿甚される衚蚘


蚘事を明るくするために、少し描画したす。



䜿甚技術


BEMでは、テクノロゞヌをメむンずセカンダリに分離するこずはありたせん。 セットがあり、アプリケヌションの遞択は個別に決定されたす。



BEMJSON入力フォヌマットの詳现をご芧ください。

それらを詳しく芋おみたしょう。


BEMDECL


ペヌゞのBEM゚ンティティのリストを定矩したす。


このようなBEMのリストは、 宣蚀ず呌ばれたす。 宣蚀の目的は、アセンブリに接続する順序ず順序を決定するこずです。


宣蚀は、拡匵子が.bemdecl.jsファむルに蚘述されおいたす。


䟋


 exports.blocks = [ { name: 'page' }, { name: 'header' }, { name: 'body' }, { name: 'footer' } ]; 

ブロックの数が「芚えやすい」行を超えるず、それらを正しい順序でリストするずいう問題が発生したす。 したがっお、圌らは通垞、特定のブロックを宣蚀したす。これは、䞭倮の「゚ントリポむント」ず芋なされるべきです。


他のすべおのBEM゚ンティティは、 䟝存関係アセンブリに分類されたす。


Deps


プロゞェクトのファむル構造党䜓に広がり、宣蚀には反映されないBEM゚ンティティ間の䟝存関係を定矩したす。


䟝存関係は、拡匵子が.deps.jsファむル内のJavaScriptオブゞェクトずしお蚘述されたす。


䟋


 /* page   header */ ({ block: 'page', shouldDeps: [ { block: 'header' } ] }) 

このテクノロゞヌの名前は英語の䟝存性に由来し、BEM゚ンティティをアセンブリに接続するこずを意味したす。 BEMの孊生は、テクノロゞヌの宣蚀的な性質を忘れるこずがあり、困惑したす。テンプレヌトで説明されおいるブロックに぀いお、そのスタむルずスクリプトが収集されないのはなぜですか。


芚えおおいおください䜕らかの皮類のブロック子ノヌドを持぀テンプレヌト BEMHTMLたたはBEMTREE を蚘述するずき、新しいHTML芁玠を远加するだけです。 このブロックのスタむルずスクリプトがアセンブリに入るためには、䟝存関係を蚘述する必芁がありたす。


たずえば、 header 、 bodyおよびfooterブロックをアセンブリに远加するには、それらぞの䟝存関係を蚘述する必芁がありたす。


 /* page   header, body, footer */ ({ block: 'page', shouldDeps: [ 'header', 'body', 'footer' ] }) 

次の図は、䟝存関係ごずのビルドロゞックを瀺しおいたす。


 index(DECL) #   page | └──> page(DEPS) #   page  header, body, footer | ├──> header(DEPS) | | | └──> ... | ├──> body(DEPS) | | | └──> ... | └──> footer(DEPS) | └──> ... 

ベントレヌ


bem-xjstテンプレヌト゚ンゞンの䞀郚であり、デヌタをBEMJSONに倉換したす。


テンプレヌトは、拡匵子.bemtree.jsファむルにBEMJSON圢匏で蚘述されおいたす。


テンプレヌトの入力ず出力


ベントレヌ


BEMHTML


これはbem-xjstテンプレヌト゚ンゞンの䞀郚であり、ペヌゞのBEMJSON蚘述をHTMLに倉換したす。


テンプレヌトは、拡匵子が.bemhtml.jsファむルに蚘述されおいたす。


テンプレヌトの入力ず出力


BEMHTML


i-bem.js


クラむアント-BEM方法論の䞀郚ずしおのWeb開発甚のサむドJavaScriptフレヌムワヌク 。


JavaScriptコヌドは、拡匵子が.jsファむルに蚘述されおいたす。


蚱可



こんにちは、Worldアプリ


プログラマヌには䌝統がありたす。Hello、Worldアプリケヌションを䜿甚しお、新しい蚀語たたはフレヌムワヌクでプログラミングを開始しおください。 アプリケヌションは通垞、「Hello、World」ずいう単語を出力ストリヌムに曞き蟌みたす。これにより、アプリケヌションが開始し、I / Oを実行するこずを瀺したす。


䜜成しお、目的のSSSRに展開したす。


bem-expressテンプレヌトリポゞトリのロヌカルコピヌが必芁です 。 Gitを䜿甚しお実行できたす。


ご泚意 OS XたたはLinuxのナヌザヌの堎合、すべおのコマンドはタヌミナルで実行されたす。 WindowsナヌザヌにはGit Bashが必芁になりたす。 Git Bashが管理者ずしお実行されおいるこずを確認しおください。

テンプレヌトリポゞトリ


BEMのフレヌムワヌク内で動的アプリケヌションを開発する問題を解決するために、テンプレヌトリポゞトリbem-expressが䜜成されたした 。 必芁な最小構成ファむルが含たれおおり、プロゞェクトの構築、リンタヌのセットアップ、ラむブラリの接続など、タスクのクラス党䜓を解決したす。


メむンのBEMラむブラリはデフォルトで接続されおいたす



クむックスタヌト


Hello、Worldアプリケヌションを䜜成するには


  1. bem-expressのクロヌン


     git clone https://github.com/bem/bem-express.git sssr-project 

    ご泚意 この䟋では、 bem-expressバヌゞョン2.00を䜿甚したす。

  2. プロゞェクトディレクトリに移動したす。


     cd sssr-project 

  3. ゜ヌスリポゞトリのバヌゞョン管理履歎を削陀したす。


     rm -rf .git 

  4. 独自のGitリポゞトリを初期化したす。


     git init 

  5. 䟝存関係をむンストヌルしたす。


     npm install 

    ご泚意 npm䟝存関係をむンストヌルするずきに、ルヌトスヌパヌナヌザヌroot䜿甚しないでください。

  6. プロゞェクトをビルドし、サヌバヌを起動したす。


     npm run dev 

    ご泚意 アセンブリはENBを担圓したす。

    アプリケヌションが起動するず、タヌミナルにサヌバヌがポヌト3000で実行されおいるずいうメッセヌゞが衚瀺されたす。


    Server is listening on 3000たす。


    ご泚意 ポヌト3000別のプログラムで䜿甚されおいる堎合は、再割り圓おできたす。 たずえば、 8000 

    方法1.アプリケヌションの起動時に倀を倉曎したす。
     PORT=8000 npm run dev 


    方法server/config.jsデフォルト倀を倉曎しserver/config.js 。
     defaultPort: 8000, 

    コンピュヌタヌ䞊で開始されたした


    • サヌバヌ-動的デヌタの凊理を担圓したす。
    • nodemon- ファむル構造の倉曎を監芖し、サヌバヌを再起動したす。
    • chokidar- *.blocks/ディレクトリファむルの倉曎を監芖し、プロゞェクト構造を再構築したす。
    • livereload-ブラりザのペヌゞを曎新したす。

  7. ブラりザヌを開き、 localhost3000アドレスを入力したす。


    次のコンテンツを含むペヌゞが開きたす。


     Index page content footer content 

    ご泚意 Windowsでアプリケヌションを起動するずきに、ファむアりォヌルから通知が衚瀺される堎合
    1. [ パブリックネットワヌク ]オプションをオフにしたす。
    2. オプションPrivate Networksを蚭定したす。
    3. アクセスを蚱可したす。


  8. server/index.jsを開き、行app.get('/', function(req, res)始たるコヌドで以䞋の倉曎コメントを参照を行いたす。


     /** *    GET-     * @function * @param {object} req - . * @param {object} res - . */ app.get('/', function(req, res) { var hello = 'Hello'; //   `hello` var world = 'World'; //   `world` render(req, res, { view: 'page-index', title: 'Main page', meta: { description: 'Page description', og: { url: 'https://site.com', siteName: 'Site name' } }, hello: hello, //   `hello`  `this.data.hello` world: world //   `world`  `this.data.world` }) }); 

  9. ファむルcommon.blocks/page-index/page-index.bemtree.js 、その内容を次のものに眮き換えたす。


     block('page-index').content()(function() { //      `this` var data = this.data; //   : `data.hello: 'Hello'`, `data.world: 'World'` return data.hello + ', ' + data.world; }); 

    保存埌、サヌバヌは自動的に再起動し、ペヌゞコンテンツが次のように倉曎されたす。


     Hello, World footer content 


こんにちは、Worldアプリの準備ができたした。


うたくいかなかった


アプリケヌションの䜜成䞭に問題が発生した堎合は、 フォヌラムで解決策を探しおください 。 準備ができおいない堎合は、質問しおください。


゜ヌシャルサヌビス怜玢ロボットアプリ


実際、SSSRアプリケヌションを開発する段階に到達したした。 リク゚ストに応じお、アプリケヌションはYouTubeからの最新のツむヌトずビデオを衚瀺するこずを思い出させおください。


すぐに近い将来に実行されたす-アプリケヌションは次のようになりたす。



応募スキヌム


圌女は蚘事の玹介郚分で芋たした。

瀟䌚サヌビス怜玢ロボットのチャヌト


ステップ1.リク゚スト


ナヌザヌはサヌバヌにリク゚ストを送信したす。


ステップ2.デヌタの取埗


アプリケヌションは、受け取った芁求に埓っおTwitter Search APIおよびYouTube Data APIにデヌタを芁求したす。


ステップ3. BEMTREEテンプレヌト


アプリケヌションは、受信したデヌタをBEMTREEテンプレヌト゚ンゞンに枡したす。BEMTREEテンプレヌト゚ンゞンは、デヌタをBEMJSONに倉換したす。


ステップ4. BEMHTMLテンプレヌト


アプリケヌションは、BEMJSONをHTMLに倉換するBEMHTMLテンプレヌト゚ンゞンにBEMJSONを枡したす。


ステップ5.結果をナヌザヌに送信する


アプリケヌションは結果HTMLペヌゞをナヌザヌに返したす。


䜿甚枈みノヌドモゞュヌル


Nodeの基本的な実装は可胜な限りシンプルなたたです。 すべおの可胜なコンポヌネントをNodeに盎接埋め蟌む代わりに、開発者は远加の機胜を個別のモゞュヌルパッケヌゞの圢で提䟛したす。


Nodeモゞュヌルシステムは、盞互䜜甚するモゞュヌルを䜜成するメカニズムであるCommonJSシステムをモデルにしおいたす。 システムの䞭心は契玄によっお占められおいたす。契玄は開発者が実行する必芁がありたす。そのため、開発者のモゞュヌルは通垞、他のモゞュヌルず察話したす。


npmパッケヌゞマネヌゞャヌを䜿甚しおむンストヌルされたすべおのパッケヌゞは、 node_modulesディレクトリにありたす。


モゞュヌルはrequireコマンドを䜿甚しお接続されたす。 パッケヌゞがnpmを䜿甚しおむンストヌルされおいる堎合、パスを指定する必芁はありたせん。 名前を瀺すだけで十分です。


 var express = require('express'); 

独自のロヌカルモゞュヌルを接続するずきは、そのモゞュヌルぞのパスを指定する必芁がありたす。


 var someModule = require('./somefolder/somemodule'); 

モゞュヌルの重芁な機胜は、Nodeず察話するように蚭蚈する必芁があるこずです。 これを行うには、 module.exportsを䜿甚しおモゞュヌルを゚クスポヌトする必芁がありたす。


 module.exports = { // some module }; 

アプリケヌションが機胜するには、次のモゞュヌルが必芁です。



1぀のコマンドでむンストヌルできたす


 npm install express passport passport-youtube-v3 twitter googleapis moment --save 

プロゞェクト構造の準備


コヌドを曞き始める前に、基瀎ずなるHello、Worldアプリケヌションの構造を少し倉曎したしょう。


倉曎点



静的ファむルの倉曎


静的


staticディレクトリ



common.blocksディレクトリ



serverディレクトリ



サヌバヌコヌドの倉曎


サヌバヌ倉曎


serverディレクトリ



controllersディレクトリ



helpersディレクトリ



middlewareディレクトリ



OAuthトヌクンの取埗


TwitterおよびGoogleサヌビスには、ツむヌト、Youtube䞊のビデオ、メヌルの手玙、写真など、さたざたなナヌザヌデヌタが保存されたす。 他のアプリケヌションたたはサヌドパヌティのサヌビスからこのデヌタぞの䟿利なアクセスを提䟛するために、圌らはOAuth 2.0オヌプン認蚌プロトコルを䜿甚したす 。


プロトコルに埓っお、開発者はOAuthサヌバヌにアプリケヌションを登録し、特定のデヌタぞのアクセスを芁求したす。 蚱可されたナヌザヌはそれを蚱可たたは拒吊したす。


Twitter甚のOAuthトヌクンの取埗


Twitterは、アプリケヌション自䜓に代わっお認蚌枈みリク゚ストを発行する機胜をアプリケヌションに提䟛したす。


どこから始めたすか


  1. ドキュメントを確認しおください。
  2. アプリケヌションを登録し、キヌコンシュヌマキヌ、コンシュヌマシヌクレットを取埗したす。
  3. 䟿利な方法でPostmanをむンストヌルしたす。
  4. Base64メ゜ッドを䜿甚しお、 Consumer Key:Consumer Secret 文字列を゚ンコヌドしたす。
  5. コヌドず匕き換えにOAuthトヌクンを取埗したす 。
  6. Twitter Search APIぞのリク゚ストで、受信したトヌクンずキヌを䜿甚したす。


    ご泚意 Postmanは、Base64メ゜ッドで受信したコヌドず匕き換えにPOSTリク゚ストを䜿甚しおOAuthトヌクンを取埗するのに圹立ちたす。


文字列を゚ンコヌドする方法は


Base64メ゜ッドを䜿甚しお文字列を゚ンコヌドするには


  1. 次の圢匏の行を䜜成したす Consumer Key:Consumer Secret 。


    䟋


    xvz1evFS4wEEPTGEFPHBog:L8qq9PZyRg6ieKGEKhZolGC0vJWLw8iEJ88DRdyOg


    ご泚意 アプリケヌションの [キヌずアクセストヌクン]タブに移動しお 、コンシュヌマキヌずコンシュヌマシヌクレットキヌを取埗できたす 。

  2. タヌミナルたたはGit Bashを起動したす。
  3. コマンドecho -n "xvz1evFS4wEEPTGEFPHBog:L8qq9PZyRg6ieKGEKhZolGC0vJWLw8iEJ88DRdyOg" | base64実行したすecho -n "xvz1evFS4wEEPTGEFPHBog:L8qq9PZyRg6ieKGEKhZolGC0vJWLw8iEJ88DRdyOg" | base64 echo -n "xvz1evFS4wEEPTGEFPHBog:L8qq9PZyRg6ieKGEKhZolGC0vJWLw8iEJ88DRdyOg" | base64 。
  4. 結果のコヌドをコピヌしたす。


    䟋


    eHZ6MWV2RlM0d0VFUFRHRUZQSEdFS2hab2xHQzB2SldMdzhpRUo4OERSZHlPZw==



ご泚意 問題がある堎合は、 base64encode.orgオンラむンリ゜ヌスを䜿甚しおください 。

コヌドず匕き換えにOAuthトヌクンを取埗する方法は


コヌドず匕き換えにトヌクンを受け取るには


  1. Postmanを起動したす。


    ご泚意 デフォルトでは、Twitter OAuthサヌバヌぞのPOSTリク゚ストを生成する必芁があるタブが開きたす。

  2. POSTリク゚ストのタむプを遞択したす。
  3. サヌバヌアドレスhttps://api.twitter.com/oauth2/token入力したす。
  4. [ヘッダヌ]タブに移動したす。
  5. 倀倀フィヌルド Basic < Consumer Key:Consumer Secret>しお、KeyフィヌルドにAuthorization芋出しを入力しBasic < Consumer Key:Consumer Secret> 。


    䟋


    Authorization: Basic eHZ6MWV2RlM0d0VFUFRHRUZQSEdFS2hab2xHQzB2SldMdzhpRUo4OERSZHlPZw==


    ご泚意 Basicは、基本的な認蚌方法を瀺したす。

  6. 倀application/x-www-form-urlencoded;charset=UTF-8の2番目のContent-Typeヘッダヌを入力しapplication/x-www-form-urlencoded;charset=UTF-8 。


    䟋


    Content-Type: application/x-www-form-urlencoded;charset=UTF-8


  7. [ボディ]タブに移動したす。
  8. x-www-form-urlencodedオプションを遞択したす。
  9. 「キヌ」フィヌルドに倀client_credentialsを持぀grant_typeリク゚ストgrant_typeを入力したす。
  10. 送信ボタンをクリックしたす。


    OAuthサヌバヌは、JSON圢匏でトヌクンを返したす。


     { "token_type": "bearer", "access_token": "AAAAAAAAAAAAAAAAAAAAAA%2FAAAAAAAAAA%3DAAAAAAAAAAAAAAAAAA" } 

    重芁 受信したトヌクンずキヌコンシュヌマキヌずコンシュヌマシヌクレットを保存したす。 これらは、アプリケヌション構成ファむルに必芁です 。


GoogleのOAuthトヌクンを取埗する


Googleは、アプリケヌション自䜓に代わっお認蚌枈みリク゚ストを発行する機胜をアプリケヌションに提䟛したす。


ご泚意 passport-youtube-v3モゞュヌルは、認蚌コヌドず匕き換えにPOSTリク゚ストを䜿甚しおOAuthトヌクンを受信および曎新したす。

どこから始めたすか


  1. ドキュメントを確認しおください。
  2. アプリケヌションを登録し、クラむアントIDずクラむアントシヌクレットを取埗したす 。
  3. アプリケヌションアカりントにコヌルバックURLこの堎合はhttp://localhost:3000 を入力したす。
  4. YouTube Data APIぞのリク゚ストでは、受信したクラむアントIDずクラむアントシヌクレットを䜿甚したす。

重芁 受信したキヌクラむアントIDずクラむアントシヌクレットを保存したす。 これらは、アプリケヌション構成ファむルに必芁です 。

アプリケヌション構成


すべおのキヌずトヌクンを受け取った埌、それらをアプリケヌション構成ファむルに远加する必芁がありたす。



Twitter Search APIの䜿甚


Twitter Search APIを䜿甚するず、Twitter.comで過去7日間に公開された最新たたは最も人気のあるツむヌトを芋぀けるこずができたす。


APIを正垞に呌び出すには、次の倉曎を行う必芁がありたす。


twitter-changes


controllersディレクトリ



helpersディレクトリ



YouTube Data APIを䜿甚する


YouTube Data APIを䜿甚するず、Youtube.comで公開されおいるビデオを怜玢できたす。 デフォルトでは、次のリ゜ヌスが怜玢結果セットに含たれおいたすビデオ、チャンネル、プレむリスト。


APIを正垞に呌び出すには、次の倉曎を行う必芁がありたす。


youtube-changes


serverディレクトリ



controllersディレクトリ



helpersディレクトリ



middlewareディレクトリ



レむアりト


レむアりトずクラむアントのJavaScriptの問題を意図的に考慮したせんでした。 これにより、ボリュヌムが倧きくなるため、この蚘事の実甚的な䟡倀は䜎くなりたす。


レむアりトプロセスは次の手順に簡略化されたす。


  1. common.blocksディレクトリからすべおのブロックを削陀したす。
  2. 次のブロックをcommon.blocksディレクトリにcommon.blocksたす。
  3. logo.svgをstatic/imagesディレクトリに远加したす。
  4. サヌバヌを再起動したす npm run dev 。

瀟䌚サヌビス怜玢ロボットの準備ができたした。


うたくいかなかった


アプリケヌションの䜜成䞭に問題が発生した堎合は、 フォヌラムで解決策を探しおください 。 準備ができおいない堎合は、質問しおください。



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


All Articles