Packhouse
Search…
Group
Packhouse Group

架構

Packhouse所有的結構與方法都必須封裝在Group內,結構大概如下:

Property

Mold: 參數型別,可視為Interface或Type的功能。
Tools:方法(Function)的最小單元。
Lines:柯里化(Curry)的結構宣告。
let group = {
molds: 'object',
tools: 'object',
lines: 'object',
mergers: 'object',
install: 'function'
}

Install

Install是初始化行為,也是Core和Group交換資料的地方,於初次引用時執行,以AWS S3為例:
// s3.js
const group = {
install: (group, options, packhouse) => {
const AWS = require('aws-sdk')
group.service = new AWS.S3({
apiVersion: options.apiVersion
})
}
}
module.exports = group

Add Group

我們可以藉由addGroup方法加入Group,並傳遞Options,但我們不推薦這麼做,請參閱正規化方法Main
packhouse.addGroup('s3', () => {
return {
data: require('./s3'),
options: {
apiVersion: '2006-03-01'
}
}
})

Mergers

針對跨Group的設計的,當GroupA要使用GroupB的方法時不能直接使用對方,必須藉由merger與Includ的引用才行,此目的能協助綁定上下文以便建立追蹤行為。
const group = {
tools: {
sum: {
handler(self, v1, v2) {
self.success(v1 + v2)
}
}
}
}
const group2 = {
mergers: {
mySum: 'sum'
},
tools: {
double: {
install({ include }) {
include('sum').tool('mySum/sum')
},
handler(self, value) {
self.tool('sum')
.noGood(self.error)
.action(value, value, self.success)
}
}
}
}
packhouse.addGroup('sum', () => {
return {
data: group
}
})
packhouse.addGroup('double', () => {
return {
data: group2
}
})
packhouse.tool('double/double').action(10, (error, result) => {
console.log(result) // 20
})

TypeScript

如果你使用TypeScript,可以使用我們提供的Declaration File:
import { Group } from 'packhouse/types'
const group: Group = {}

Lazy First

盡可能不要在外部宣告require,可以確保引入的效能、文件的生產與單元測試時Mock行為最佳化。
// 這是個糟糕的例子 😢
const AWS = require('aws-sdk')
const group = {
install: (group, options) => {
group.service = new AWS.S3({
apiVersion: options.apiVersion
})
}
}
module.exports = group
// 這是個優良案例 🤣
const group = {
install: (group, options) => {
const AWS = require('aws-sdk')
group.service = new AWS.S3({
apiVersion: options.apiVersion
})
}
}
module.exports = group
Last modified 2yr ago
Copy link
On this page
架構
Property
Install
Mergers
TypeScript
Lazy First