--- title: 2024程設筆記 tags: 2024 author: xCk27x --- # 關於網頁的50個問題 解答 ###### tags: `2024` ## 前端 1. ```html <!-- flex --> <div id="parent" class="flex justify-center items-center"> <p id="child">我想置中</p> </div> <!-- position --> <div id="parent" class="relative h-40 w-60"> <p id="child" class="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2">我想置中</p> </div> <!-- margin --> <div id="parent" class="flex h-40 w-60"> <p id="child" class="m-auto">我想置中</p> </div> ``` 2. 對png圖片使用css的drop-shadow屬性 3. 再包一層不就沒事了 ```html <div id="grandParent" class="relative"> <div id="container" class="absolute h-full w-full"> <div id="parent" class="relative h-full w-full"> <p id="child" class="absolute"> 請勿更動這家人的position設定 </p> </div> </div> </div> ``` 4. .intro -> class="intro" #Lastname -> id="Lastname" h1, p -> 所有```<h1></h1>``` 以及 ```<p></p>``` div .container -> 在div以內任何class為contaier的元素 5. - 第一種: props ```html <script setup> const props = defineProps(['foo']) console.log(props.foo) </script> ``` - 第二種: emit ```html <!-- parent --> <template> <ChildComponent @child-click="funcA"/> </template> <script setup> import ChildComponent from './ChildComponent.vue'; function funcA(val) { console.log(val); } </script> <!-- child --> <template> <button @click="funcB"></button> </template> <script setup> import { defineEmits } from 'vue'; const emit = defineEmits(['child-click']); function funcB() { emit('child-click', 'hello'); } </script> ``` - 第三種: state (pinia) ```typescript import { defineStore } from 'pinia' export const useCounterStore = defineStore('counter', () => { const count = ref(0); function reset() { count.value = 0; } return { count, reset } }) ``` 6. 提供兩種做法 ```html <!-- max-h --> <div class="w-60 h-40"> <img class="max-h-full w-auto" src="fit-parent.png" /> </div> <!-- object-cover --> <div class="w-60 h-40"> <img class="w-full object-cover" src="fit-parent.png" /> </div> ``` 7. scss比較結構化 ```css .section { width: 100vw; height: 100vh; position: relative; } .section p { color: white; } .section p:hover { color: red; cursor: pointer; } .section_container { min-width: 10rem; position: absolute; left: 3rem; right: 3rem; outline: 1px solid black; } .section_container-1 { background-image: linear-gradient(to right bottom, black, white); } .section_container-2 { background-image: linear-gradient(to bottom, gray, blue); } .section_container-3 { background-image: linear-gradient(to left top, red, yello); } ``` 8. grid中的col數量不固定,會盡可能地塞進最多100px以上的col。如果塞完這些100px的col後發現還有剩餘空間,會再動態的調整col的寬度。另外,每個col中被規定要有1rem的間隔。 9. https://play.tailwindcss.com/mpKTjHSCyV 10. ```css .infinite_loop { animation-iteration-count: infinite; // 方案A animation: anim-name ease-in 0s infinite; // 方案B } ``` 11. 被設定display:none的元素會直接被從DOM樹移除,意思是他完全從網頁上消失了。visibility:hidden則是你無法跟他互動,但是他仍然存在,有點像幽靈的感覺。 12. clamp(min, val, max) 的意思是,大小以val為準,但是上下限是min跟max。 13. media(min-width: 540px) ## JavaScript 1. 第二個'a'因為前面的+號被轉換成'NaN',連起來就變成'baNaNa',再換成小寫就是'banana'; 2. ```[1,2,3,4,5,6,7].map(val => val**2)``` 3. ```[1,2,3,4,5,6,7].filter(val => val % 3 === 0)``` 4. ```[1,2,3,4,5,6,7].reduce((acc, val) => acc * val)``` 5. - push從最後插入元素,回傳修改過的陣列長度。 - unshift從最前面插入元素,回傳修改過的陣列長度。 - concat將兩個元素依序合併,回傳修改過的元素。 6. ```shell $ 3 $ 3 $ 3 ``` > setTimeOut是指「保證會在n秒後才執行callback function」,而在n秒後for迴圈早就跑完3次了,因此此時的i值都會是3。 7. event loop會持續監聽call stack,當發現call stack沒有待辦的任務時,會將callback queue的工作送回call stack來被執行。 8. callback function其實就只是被當做參數傳進另一個函數(A)的函數(B),因此B會在A中被調用,而什麼時候被調用則要看A具體的程式碼。 > 有迷思是B只會在A結束時調用,這是錯的。 9. 當這個Promise物件的resolve()被調用時,簡單的說,就是當這個Promise成功的被執行完後,then()中的callback function就會被執行。 ## TypeScript 1. ```typescript let a: number = 10; let a = <number>10; let a = 10 as number; ``` 2. ```typescript type Person = { name: string, age: number, phone?: string } ``` 3. ```typescript interface Machine { price: number, weight: number, move(dire: string): void } ``` 4. ```typescript let strList: string[] = []; ``` 5. 一個type為obj的物件,他的索引值只可以是string類型,並且對應到的屬性值為number類型。 6. - true: number(0與NaN除外)、string(空字串除外)、true - false: 0, NaN, '', false, null, undefined 7. ```typescript function noReturn(): void {...} ``` 8. 因為callback function的argument型態是被調用他的function所決定的。所以除非這個function有特別的重載要求,不然沒必要特地對callback function的argument進行型別宣告。 ## vue/nuxt 1. ```javascript // 最基本是直接用useFetch加一段網址就好 const res = await useFetch('https://ncufresh.ncu.edu.tw/'); // 當然你可能要在請求中添加一些選項 const res = await useFetch('https://ncufresh.ncu.edu.tw/', { method: 'GET', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${jwtToken}` } } ); ``` 2. 當你的路由無法匹配時,會轉到這個頁面(404) 3. - Layouts: 頁面中會固定出現的部分,使用<slot></slot>表示要包含的內部頁面。 - Components: 會重複利用的組件,可以簡單地被其他檔案調用。 4. 在nuxt中這兩個完全沒差。 ## Git 1. ```shell $ git add -A $ git commit -m "message" ``` 2. - git merge會建立一個新的commit,其中包含了兩個分支的所有commit - git rebase將當分支街道目標分支的末端,好處是git graph上看會比較漂亮,壞處是會修改git歷史。 3. ```shell // 這三種方法都行 $ git rebase $ git merge $ git pull ``` 4. - soft: 只是把commit取消,但檔案都還在暫存區中,重新commit就變回原樣了。 - mixed(預設): 同上,但是東西會被從暫存區中拿出來,要重新add。 - hard: 直接把commit中的檔案都刪掉,讓工作區強制回到舊版的狀態。 5. - revert: 建立一個新的commit,來取消舊版的變更。 - reset: 刪除commit讓分支回到舊版。 6. 等同```git branch <branchName>``` + ```git checkout <branchName>```,建立新分支並切換到此分支。 7. 將分支移動到當前所在commit的前三個commit的位置。 8. 因為遠端還並沒有test1這個分支,所以要先讓遠端創建test1這個分支,才可以進行push。將push的指令改為```git push -u origin test1```即可。 ## Express 1. middleware是指在獲取到request的過之前,要先經過的一些處理函數。 2. 將request的body部分轉為特定格式,通常是json。 3. ```javascript const express = require('express'); const app = express(); app.get('/', (req, res) => { res.send('Hello, World!'); }); app.listen(3000); ``` 4. - 如果能以postId跟commentId成功獲取資料庫中的comment,以 **200** 狀態碼跟內容 **文章postId的評論commentId:comment** 作為response回傳。 - 如果僅存在postId但commentId不存在,以 **404** 狀態碼跟內容 **評論不存在** 作為response回傳。 - 如果postId不存在,以 **404** 狀態碼跟內容 **文章不存在** 作為response回傳。 5. 題目描述不清楚,送分 6. '評論不存在' 7. 嘗試從users中找到id屬性為userId的object,如果找到了,則回傳此物件的name屬性值。若沒找到則以狀態碼 **404** 回傳 **用戶不存在** 8. 因為在req.params的值通常都是string類型。 9. request在myMiddleware便停止向後傳送,主要處理函數將無法收到request,因此客戶端也無法收到response。 10. CSRF(跨網站請求偽造攻擊)是指當正常user因典籍惡意連結等原因,讓網站資料及個人信息被attacker獲取,使attacker能夠透過user身分向網站發送請求。 CSRF保護則是建立在「特定資訊只有網站自己知道」的前提下,先在返回前端頁面時帶上csrf_token,在每次收到請求時都檢查csrf_token的值是否與session中相同。 express中使用npm中的csrft進行csrf保護,詳細請見官網 https://www.expressjs.com.cn/en/resources/middleware/csurf.html