OpenJSアーキテクトにおけるサーバレス依存性管理


OpenJS Architect AWSにServerlessなアプリケーションを書いて、配備するためのオープンソースフレームワークです.各アーキテクトプロジェクトは、独自の孤立したランタイムでstatelesslyに実行される多くの小さくて独立したラムダ関数から成ります.
では、どのようにして共有コードと関数間の依存関係を管理できますか?

rootで定義された依存関係package.json以下のように展開している各ラムダ関数に依存関係を使用します@architect/functions 図書館.アーキテクトは、プロジェクトのルートを使用する能力を発見する必要がありますpackage.json あなたのラムダ関数に依存関係をインストールするには.例を見てみましょう.
最初に、新しい建築家プロジェクトを作成することから始めてください
npm init @architect ./arc-example
cd arc-example
npm install @architect/functions
インストールによって@architect/functions 根までpackage.json それはあなたがそれを必要なときにすべての機能に利用できるようになります.機能ごとに依存関係を管理する必要はありませんpackage.json .
だから今我々はそれを使用することができますget-index 関数.
// src/http/get-index/index.js

let arc = require('@architect/functions')

async function route(req) {
  return {
    statusCode: 200,
    html: `<h1> Praise Cage </h1>`
  }
}

exports.handler = arc.http.async(route)
src/shared and src/views共有コードを処理する別の方法は、特別なフォルダsrc/shared . 建築家は、抽象的なあなたの機能のコードを再利用する簡単な方法を提供します.ほとんどのアプリケーションはロジック、テンプレート、ユーティリティを共有する必要があります.これをするために、建築家は、フォルダ・コンベンションを使用してsrc/shared and src/views 各関数のnode_modules ディレクトリ.
これは、全体の内容を注意することが重要ですsrc/shared 再帰的にコピーされる.ディレクトリ構造をできるだけ平らにし、ペイロードをできるだけ小さくして性能を向上させることをお勧めします.
ヘルパー関数の例を作りましょう.
src/shared
開始するには、コマンドラインから新しいプロジェクトを作成します.
npm init @architect ./arc-shared-views
次に、我々はapp.arc 次のプロジェクトのルートファイルです.
# app.arc file
@app 
arc-shared

@http
get /
get /answer
今、我々は我々を造り出すことができますsrc/shared モジュールを新しいフォルダを作成するsrc/shared/helper.js . この例では、数が文字列に変換され、このヘルパー関数がトリックを行うことを確認する必要があります!
// src/shared/helper.js

function theAnswer() {
  //really important number that needs to be converted to a string
  let universe = 42 
  return universe.toString()
}

module.exports = theAnswer
我々は、ちょうどそれを必要とすることによって、我々の機能のすべてでこのヘルパーを使うことができます@architect/shared . 次の関数を取得します
// src/http/get-answer/index.js

let Answer = require('@architect/shared/helper')

exports.handler = async function http (req) {
  return {
    statusCode: 200,
    headers: {
      'cache-control': 'no-cache, no-store, must-revalidate, max-age=0, s-maxage=0',
      'content-type': 'text/html; charset=utf8'
    },
    body: `
      <!DOCTYPE html>
      <html lang="en">
      <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title> The Answer is </title>
      </head>
      <body>
        <p> This is the Answer: ${Answer()} </p>
      </body>
      </html>
    `
  }
}
ランnpm start コマンドラインから、我々のコード構造を見てください.サンドボックスは、我々の機能を水和させますnode_modules/@architect/shared 展開して実行されるとき、関数のペイロードの一部であるディレクトリ.
.
├── src
│   ├── http
│   │   ├── get-index/
│   │   └── get-answer/
│   │
│   └── shared/
│       └── helper.js
│   
├── app.arc
└── package.json
ときに移動http://localhost:3333/answer あなたは私たちの共有モジュールからのデータで迎えられます、そして、それは他のどんな機能によってでも使われることができます.
src/views
The src/views フォルダーは、それぞれのHTPP機能のためのコードを含めるルートを含めることができます特別な場所です.続きを読むsrc/shared HTTP機能を使用できるレイアウトテンプレートを使用します.
変更するapp.arc 次のファイルにマッチします.
@app
arc-shared

@http
get /
get /answer 
get /about
get /css/:stylesheet

@views
get / 
get /about
我々がしたことは、2つの新しいルートを加えました/about and css/:stylesheet , それから2つのルートを宣言した/ and /about は、src/views .
新しいフォルダとファイルを作成します.src/views/layout.js . このファイルで次の内容を書きます
module.exports = function Layout (props) {
  props = props || {}
  let heading = props.heading || 'Architect views!'
  return `
<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Architect example</title>
 <link rel="stylesheet" href="/css/styles.css">
</head>
<body>
 <h1>${heading}</h1>
</body>
</html>
`
}
これは、それぞれのGETルートで使用される共有ビューテンプレートです@views プラグマapp.arc ファイル.
次に、変更しますsrc/http/get-index/index.js 次のようにします.
let Layout = require('@architect/views/layout')

exports.handler = async function http (request) {
  try {
    return {
      statusCode: 200,
      headers: {
        'content-type':'text/html; charset=utf8'
      }, 
      body: Layout()
    }
  } catch (e) {
    console.error(e)
    return {
      headers: {
        type: 'application/json; charset=utf8',
      },
      status: 500,
      body: JSON.stringify({
        name: e.name,
        message: e.message,
        stack: e.stack
      }, null, 2)
    }
  }
}
この関数は、レイアウトファイルを呼び出し、その出力をレスポンスの本文として返します.次に、ページに設定することで、プロップに別のセットを送ることができます.変更するsec/http/get-about/index.js 次のようにします.
let Layout = require('@architect/views/layout')

exports.handler = async function http (request) {
  try {
    return {
      statusCode: 200,
      headers: {
        'content-type':'text/html; charset=utf8'
      }, 
      body: Layout({heading: 'About'})
    }
  } catch (e) {
    console.error(e)
    return {
      status: 500,
      type: 'application/json; charset=utf8',
      body: JSON.stringify({
        name: e.name,
        message: e.message,
        stack: e.stack
      }, null, 2)
    }
  }
}
現在/about が要求された場合、この関数は実行され、Layout() .
最後に、いくつかのファインダー制御を取得する関数を取得する/src/views コピーします.我々は、この@views プラグマapp.arc ファイル.我々はスタイルシートにURLを作成したいが、この関数はレイアウトコードへのアクセスを必要としません.下のGETルートだけ@viewssrc/views コードをコピーします.の最初のルート/answer でないsrc/views モジュールnode_modules .
コードを変更するsrc/http/get-css-000stylesheet/index.js 次のようにします.
const styles = `
body {
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
}
`
exports.handler = async function http (request) {
  return {
    statusCode: 200,
    type: 'text/css; charset=utf8',
    body: styles
  }
}
OK!先に行きなさいnpm start プロジェクトのルートからhttp://localhost:3333 アクションで我々のアプリを参照してください.ルートを変更するhttp://localhost:3333/about そして、あなたは我々の適当が予想通りに通過されるのを見ます.
REPOの完全なコード例を見てください.https://github.com/pchinjr/arc-shared-views-example