1-6
AWS ELB
- loadbalance 會依照自訂的頻率去 call 自訂的(port path...等等)檢查應用程序是否健康
- 官方範本是預設
/
根路徑和導流自訂的 port 去檢查健康,若服務沒設根路徑的 api 做回應則會一直被檢測為不健康而一直重複關掉啟動
Vue config (環境變量與模式)
定義變量名稱必須 VUE_APP 開頭
.env
優先度最低但所有模式都會載入,再來是.development(模式,可自定義)
,再來是.local
但不會進 git,最後是vue.config.js
優先度最高vue-cli-service build --mode custom
在後面加入 mode 參數可指定自定義的模式
Vue config/Webpack
- vue.config.js 打包時排除套件
module.exports = {
configureWebpack: { // 此定義的配置將被‘合併’進 webpack 中
externals: [
{
vue: 'Vue',
'aws-amplify': 'aws_amplify'
}
]
}
}
// 左邊的 key 是指 npm package name; 右邊的 value 是外部連結註冊全域的變數名(window.aws_amplify)
module.exports = {
configureWebpack: config => { // 可更改為函數寫法,接收的參數:config 為原本配置好的物件,可直接做更改
if (process.env.NODE_ENV === 'production') {
} else {
}
}
// 另外還有 `configureWebpack: config => .... 鏈式寫法可做更彈性化易用性的設定配置`
}
- 如環境變量名稱想自訂,又不想綁在 VUE_APP 限制下,可以在 htmlwebpack 底下新增屬性,讓 html 模板可取用 (但 VUE_APP 變量可以在客戶端使用)
chainWebpack: config => { // 設定自定義變數,可用於 html 模板 <%= htmlWebpackPlugin.options.test %>
config
.plugin('html')
.tap(args => {
args[0].test = 'test' // 只能在 options 底下增加或修改屬性
args[0].test2 = 'testtest'
args[0].test3 = 'TESTTESTTEST'
// args[1] = { coustom: 'coustom' } // 無法在 htmlWebpackPlugin 物件底下增加屬性
return args
})
},
configureWebpack: config => {
config.plugins[4].options.test = 'from configureWebpack' // 只能在 options 底下增加或修改屬性
config.plugins[4].options.test4 = 'from configureWebpack'
// config.plugins[4].test = 'not options from configureWebpack' // 無法在 htmlWebpackPlugin 物件底下增加屬性
}
AWS S3
- 下
S3 sync
指令時 加此參數:--cache-control 'max-age=604800'
、--cache-control 'no-cache'
能設定 cache 時效 - 應用:sync 前端檔案時,用
--exclude index.html
,其餘檔案可設快取時效或不設,index.html 本身做 no-cache,之後每次佈版就不用再清快取了(其餘檔案不用 no-cache 是因為 css js 打包產出時都會帶 hash,但缺點是要定期清舊的檔案,因為 s3 sync 只會新增或更新)
try...catch... 語法
- 在
try{}
裡面有有 throw error 才會跳至catch{}
執行,但一般賦值 undefine 之類的錯誤是不會跳的
JavaScript 撰寫風格指南
html-webpack-plugin/lodash template 語法
https://cli.vuejs.org/zh/guide/html-and-static-assets.html#%E6%8F%92%E5%80%BC
環境變量皆可使用到
<%= VALUE %>
用来做不转义插值;<%- VALUE %>
用来做 HTML 转义插值;
// 用 Javascript 做處理,這裡用到 lodash 提供的函式
<% _.forEach(VUE_APP_TEST4.split(','), function(test) { %><script type="text/javascript" title="<%= test %>"></script><% }); %>
ES6
let a = [1,2,3,4,5]
let b = a
let c = [...a]
b[0] = '222'
// a 的值也會被修改
// c 不會
解構賦值複習:https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment
實用:預設參數:
function drawChart({size = 'big', coords = {x: 0, y: 0}, radius = 25} = {}) {
console.log(size, coords, radius);
}
// = {} 可在呼叫函式未帶變數時做預設參數 即 drawChart() 可直接執行,若不加 = {} 則會報錯
drawChart({
coords: {x: 18, y: 30},
radius: 30
});
v-for
可以遞迴物件
Vue web component
- 為外置的 Vue component ,自己會有一個 Vue 實體,有提供像一般組件的 props 和 $emit event 接口供主程式的 Vue 做互動
- Vue 需要用 CDN 引入,否則 Vue web component 和主程式需個別包 Vue
- 有異步載入的功能,若有多個 web component,一起打包時還會生出個小入口檔,並在需要渲染該 web component 時才載對應的 JS
- 其事件觸發傳來的資料為要下
參數.detail
才拿得到,與一般 component 傳來的資料直接拿有點差別 - 文件:https://cli.vuejs.org/zh/guide/build-targets.html#%E5%BA%94%E7%94%A8
Vue component 的 name 作用
- 提供自身引用自身
- 官方開發工具上可看到組件名稱,方便除錯
<keep-alive>
可用 include 和 exclude 指定組件
Vue Cannot read property 'ob' of undefined
- .vue 檔內,data 的值要用函式 return 的方式
Vue web component
- 加入 i18n 或其他 plugin 方式:https://stackoverflow.com/questions/53341395/how-can-i-use-vue-i18n-in-a-vue-web-component
Vue component 事件
- 若要在自定義的組件上綁定原生事件,例如:click,則需要在後面加 .native
<my-component @click.native="myEvent" />
Vue component library
// /components/index.js
import Vue from 'vue'
import MyButton from './MyButton.vue'
import MyCard from './MyCard.vue'
import MyInput from './MyInput.vue'
const components = {
MyButton,
MyCard,
MyInput
}
Object.keys(components).forEach(name => {
Vue.component(name, components[name])
})
export default components
// 打包入口檔寫這樣
package.json
指令增加這個vue-cli-service build --target lib --name my-lib 'src/components/index.js'
- 教你如何打包 Vue 元件庫並上架到 npm :https://medium.com/justfrontendthings/how-to-create-and-publish-your-own-vuejs-component-library-on-npm-using-vue-cli-28e60943eed3
- 如有寫 css 則輸出會有 css 檔(若 vue.config.js 有設定 css extract: false 則會內聯在 js 檔內),js 有 commo.js 跟 umd.js 兩種
- 要在專案內載入自己包的 lib 可在 index.html 用 script 標籤載入即可 (有 css 檔的話也要載),注意 Vue 要是全域的,且 lib 載入是在 vue 之後,專案之前
- 若是要包在專案內則照一般 plugin 的方式,在 main.js 中
import my-lib.umd.js
,即可使用 (若有 css 檔則需自行引入一起打包或不引入放<link>
) - --watch 模式時是 development mode ,這時 npm run build 出來的只有 js 檔,css 是內聯在裡面,沒有加 —watch 時是 production mode,這時 build 出來的就是 js 檔和 css 檔
Vue component slot
Google reCAPTCHA
Object.freeze()
凍結一個物件,屬於淺凍結,其內的屬性不能被修改、新增、刪除和可設定性、可寫性被改動等等,同時也防止此物件的原型被改變
在 use strict (嚴格模式)下,改動 freeze 過的物件會報錯,一般則不會
let obj = { prop: 42, prop2: { prop: 'test' } };
Object.freeze(obj)
obj.prop = 33; // Throws an error in strict mode obj.prop2 = [1,2,3]; // Throws an error in strict mode obj.prop2.prop = 3; // 可以被改變,非深凍結 obj = 2 // 會被改變其參考,可用 const 解決
Object.seal()
為不可新增刪除物件內屬性,但可以修改也因為不能改寫的特性,在資料量大且不會變動的情況下使用 Object.freeze(),能使 Vue 的效能提升
Fake Path
- 基於瀏覽器安全性,上傳的檔案拿不到此檔案的本機路徑,Fire Fox 和 Edge 有方法可以拿到但 Chrome 不行
Lora Server
- 在 Lora Server images 內同時讀 ENV 和 volume 的 toml 檔,ENV 優先度較大
EFS & EBS
- EFS:文件系統,能同步在多個 AZ 並掛載多個 EC2 或 ECS 的 container 上,資料同步為強一致性,價錢較貴
- EBS:塊級磁碟區,需自行設置容量和格式,只能掛載在一個 EC2 上,價錢較便宜
AWS EFS
- 能操作 EFS 內檔案只能使用 data sync 服務或是通過掛載的 EC2 or ECS 的 container 操作
- 初始 EFS 內為空白根目錄而已,如果掛載的 EFS 檔案路徑不存在的話會起不了
- 若把 EFS 掛載到 ECS container 的工作目錄,工作目錄原有的東西會被 EFS 蓋掉而運行不了
ECS TaskDefinition ENV
- ENV 有三種方式可以設: dockerfile、taskdefinition、來自 s3 的 .env 檔
- 優先度是 taskdefinition > .env 檔 > dockerfile
- .env 檔 在 AWS console 和 AWS SDK 都可以設,但 cloudformation 沒有提供
Linux Shell Script
- 在工作目錄下新增 .sh 檔,內容例:
sam package --s3-bucket bocheng-ap-northeast-1 --template iamrole.yaml --output-template-file iamrole.packaged.yaml --profile dev-jasonzhuang
sam deploy --template-file iamrole.packaged.yaml --stack-name test-${userName}-iamrole --capabilities CAPABILITY_IAM CAPABILITY_AUTO_EXPAND --profile dev-jasonzhuang --region ap-northeast-1 --parameter-overrides TagName=${userName}
- 輸入
./deploy.sh
可執行 sh 檔內的指令 (同步,會照順序執行) (若某一行指令出錯會顯示並繼續執行下一行不會中斷) userName=chengcheng ./deploy.sh
在指令前宣告參數可帶入執行指令內,${userName}
即可取得
AWS ECS
- Q: 多個 taskdefinition 在同一個 stack 中,若改動其中一個 taskdefinition,其他 taskdefinition 是否會跟著進版?
- A: 不會,只有更動的會進版
- task 有更動會在更新 stack 時先起新的 task 再把舊的 task 關掉,所以 EC2 資源不夠容納兩倍數的已更動 task 的話會卡住更新
- task 更新為藍綠部署,若舊的還有人在 access 的話不會關閉直到全部連線結束,期間會將新流量導到新的 task
Linux Shell Script
rm -r dirname/
:可以強制刪除有的東西的檔案夾scp 57ca893e.* user@192.168.1.199:greengrass/certs/
:scp 指令是用於在不同主機間傳遞檔案- https://blog.gtwang.org/linux/linux-scp-command-tutorial-examples/
AWS cloudformation
- 整數或浮點數。AWS CloudFormation 會將參數值驗證為數字;不過,當您在範本中的其他位置使用參數時 (例如,使用
Ref
內部函數),參數值會變成字串。 - 當 cloudformation 沒支援的資源可以用 custom resource 去呼叫 lambda 操作 sdk 建資源,其呼叫、傳入值與回傳值都要符合 cloudformation 的規則,其傳入值可判斷 stack 目前是 create、update.... 從而去做對應操作
AWS IoT
- IoT 需要 service-role 才能執行 deploy 到設備,因 cloudformation 沒有此資源可以建立,所以用 custom resource 呼叫 lambda 操作 sdk 將對應的 role associate 到 IoT
AWS cloudformation
- yaml 有做修改會更新,若是下指令
--parameter-overrides
第一次有加,第二次沒加的情況不會更新。 - 若額外用 sdk 或 console 頁面更改其他資源設定,cloudformation 在下次更新時不會覆蓋掉額外的設定,除非有更新的地方和額外設定是同一種
- 更新方式是根據對應資源的 update 行為而定,有些設定可以複數會先加新的再把舊的砍掉(像這情況如果舊的被額外操作修改過,則 cloudformation 會不認得所以最後會有兩個設定值),有些設定為單一則會直接覆寫
- 像更改 taskdefinition 內設定後,task 會先啟新的一批將新流量導去,待舊的 task 沒有流量後,再關掉舊的
AWS Service Discovery
- Q: service discovery 是否跟 loadbalancing 一樣能分發流量?
- A: 不行,有多個同樣的只會 access 到同一個,除非那一個被關掉,才會 access 到另一個
npm script
npm run <script> -- —<parameter>=123 —<parameter>=456
- 可帶參數進去要跑的 script 內 (帶在前面為 process 環境變量,若同時執行多個指令用同一個環境變量會打架)
- https://docs.npmjs.com/cli-commands/run-script.html
AWS ECS
- 每個 EC2 給的 ENI 不多,而且本身會吃掉一個,所以後來 aws 推出 awsvpcTrunking 功能,能讓特定 EC2 的 ENI 很多
- awsvpcTrunking 需要手動開啟或 SDK 或 cli (無 cloudformation)
- 開啟後啟動的實例才會有很多 ENI,且限定幾種 type 的 EC2 而已
- 其中 a1 系列為通用便宜型,但 AMI 只能使用 Arm64 架構,一般 docker image 是 x86 之類的,跑在上面不能正常執行,故需將程式包成能在 Arm64 架構執行的 image
- Arm64 架構 AMI 不適用指令或主控台直接更新,只能手動進去實例更新或重開...
docker
- docker 要包 Arm64 上可以跑的 image 需裝 docker buildx 指令:https://www.docker.com/blog/getting-started-with-docker-for-arm-on-linux/ (裝 buildx 指令、啟用 Arm64 的 container 用來執行包 image 的程序)
- buildx 時後面加
--load
不加--push
即為輸出到本地 - 本地輸出時,
--platform
只帶一種 (不然輸出多個平台的 image 但名稱都共用同個會打架) (push 到 dockerhub 不會是因為會在名稱後多加個 sha 亂數)
x86/x64 & ARM
- x86/x64 架構執行複雜指令集,性能好較耗電,常用於桌電筆電
- ARM 架構執行精簡指令集,性能比上個差些但較省電,常用於移動裝置如手機
- 參考文章:https://medium.com/@kmsh3ng/%E4%BA%94%E5%88%86%E9%90%98%E6%90%9E%E6%87%82-cpu-x86-x64-vs-arm-%E7%9A%84%E5%B7%AE%E7%95%B0-d32235f2537c