寫在前面
畫(huà)個(gè)簡(jiǎn)圖
其實(shí)沒(méi)什么好說(shuō)的,見(jiàn)到一題收一題崇败,盡可能地附有答案,下面的問(wèn)題都比較基礎(chǔ)
HTML相關(guān)
行內(nèi)和塊元素
塊:address坑匠、 blockquote布卡、 center雨让、 dir、 div忿等、 dl宫患、 fieldset-form、form这弧、 h1~h6娃闲、 hr、ol匾浪、 p皇帮、 pre、 table蛋辈、 ul等
行內(nèi):a属拾、abbr、acronym冷溶、b渐白、bdo、bidi逞频、override纯衍、big、br苗胀、cite襟诸、code、dfn基协、em歌亲、font、i澜驮、img陷揪、input、kbd、label悍缠、q揩慕、s、samp扮休、select迎卤、small、span玷坠、strike蜗搔、strong、sub八堡、sup樟凄、textarea、tt兄渺、u缝龄、var
H5新標(biāo)簽
布局類section、article挂谍、aside叔壤、footer、header口叙、nav 流媒體audio source video 圖形:canvas
HTML標(biāo)簽語(yǔ)義化有何意義
1.利于SEO炼绘;2.使得頁(yè)面在CSS未加載的時(shí)候,保持較為明晰的布局結(jié)構(gòu)妄田。
CSS相關(guān)
CSS 盒模型的理解
標(biāo)準(zhǔn)模型:content - 內(nèi)邊距 - border - margin俺亮,寬高為content尺寸
IE模型:content - 內(nèi)邊距 - border - margin,寬高為content+內(nèi)邊距+邊框的 尺寸
box-sizing: content-box按照標(biāo)準(zhǔn)模型設(shè)置寬高 border-box按照IE模型設(shè)置寬高;
對(duì)于一個(gè)未知寬高的盒子疟呐,如何讓它水平垂直居中于父元素
table脚曾,flex,grid
浮動(dòng)有何影響启具,如何清除:
對(duì)一個(gè)元素設(shè)置float本讥,其父元素?zé)o法撐開(kāi)高度。
<div class="father">
<div class="son">son</div>
</div>
.son {
width:50px;
height:50px;
float:left;
}
最佳方法:對(duì)元素添加一個(gè)偽元素富纸,加入清除浮動(dòng)屬性:
.son::before{
content:'';
clear:both;
}
flexbox 布局
http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html?utm_source=tuicool
flex的缺點(diǎn):瀏覽器調(diào)試工具支持不友好(主要表現(xiàn)為margin上)
CSS3 動(dòng)畫(huà)
animation
根據(jù)關(guān)鍵幀設(shè)置元素的漸變
div
{
animation: letscheckitout 5s;
-webkit-animation: myfirst 5s; /* Safari 與 Chrome */
}
@keyframes letscheckitout
{
0% {background: red;}
25% {background: yellow;}
50% {background: blue;}
100% {background: green;}
}
屬性 | 作用 |
---|---|
@keyframes | 聲明動(dòng)畫(huà) |
animation | 所有動(dòng)畫(huà)屬性的簡(jiǎn)寫屬性囤踩,除了 animation-play-state 屬性 |
animation-name | 規(guī)定 @keyframes 動(dòng)畫(huà)的名稱 |
animation-duration | 規(guī)定動(dòng)畫(huà)完成一個(gè)周期所花費(fèi)的秒或毫秒。默認(rèn)是 0 |
animation-timing-function | 規(guī)定動(dòng)畫(huà)的速度曲線晓褪。默認(rèn)是 "ease" |
animation-fill-mode | 規(guī)定當(dāng)動(dòng)畫(huà)不播放時(shí)(當(dāng)動(dòng)畫(huà)完成時(shí),或當(dāng)動(dòng)畫(huà)有一個(gè)延遲未開(kāi)始播放時(shí))综慎,要應(yīng)用到元素的樣式 |
animation-delay | 延遲時(shí)間涣仿。默認(rèn)是 0 |
animation-iteration-count | 規(guī)定動(dòng)畫(huà)被播放的次數(shù)。默認(rèn)是 1 |
animation-direction | 規(guī)定動(dòng)畫(huà)是否在下一周期逆向地播放。默認(rèn)是 "normal" |
animation-play-state | 規(guī)定動(dòng)畫(huà)是否正在運(yùn)行或暫停好港。默認(rèn)是 "running" |
transision
對(duì)單一屬性進(jìn)行漸變愉镰;
transition: 漸變屬性 持續(xù)時(shí)間 變化速度曲線 延遲時(shí)間;
transition-property:漸變屬性 CSS屬性;
transition-duration:持續(xù)時(shí)間
transition-delay:變化速度曲線
transition-timing-function:延遲時(shí)間
其中钧汹,變化速度曲線有一下幾個(gè)屬性
transition-timing-function:
linear 恒定速度 等價(jià)于cubic-bezier(0,0,1,1)
ease 慢入慢出丈探,中間快速 等價(jià)于cubic-bezier(0.25,0.1,0.25,1)
ease-in 慢入 等價(jià)于cubic-bezier(0.42,0,1,1)
ease-out 慢出 等價(jià)于cubic-bezier(0,0,0.58,1)
ease-in-out 慢入慢出,中間正常速度 等價(jià)于cubic-bezier(0.42,0,0.58,1)
cubic-bezier(n,n,n,n) 自定義貝塞爾曲線(參數(shù)為2個(gè)錨點(diǎn)的X,Y坐標(biāo))
http://www.w3school.com.cn/tiy/t.asp?f=css3_transition
div {
width:100px;
transision : width 2s ease;
}
div:hover {
width:300px;
}
DOM相關(guān)
瀏覽器存儲(chǔ)方式:cookie拔莱、localStoreage和sessionStorage的區(qū)別
cookie使用最多且是與服務(wù)端通信的主要方式碗降,但是長(zhǎng)度有限制,容量小塘秦。
sessionStorage和localStorage讼渊,IE需要用userData做兼容,容量比cookie大很多session在用戶關(guān)閉標(biāo)簽/窗口后失效尊剔,local關(guān)閉瀏覽器后依然保存爪幻,需要手動(dòng)清除。
事件捕獲和事件冒泡
用戶點(diǎn)擊须误、移動(dòng)鼠標(biāo)等一切事件挨稿,DOM元素及其父/子元素都能夠監(jiān)聽(tīng)得到,方式為:
事件捕獲:從根元素到目標(biāo)元素監(jiān)聽(tīng)
事件冒泡:從目標(biāo)元素到根元素監(jiān)聽(tīng)
什么是事件委托京痢,event.target event.currentTarget的區(qū)別
假設(shè)一個(gè)列表叶组,有上百個(gè)子元素
<ul>
<li></li>
<li></li>
<li></li>
...100多條
</ul>
如果對(duì)每一個(gè)li綁定onclick事件,新建了很多函數(shù)历造,開(kāi)銷就會(huì)非常大甩十。
使用事件委托方法,對(duì)父元素綁定事件吭产,就可以通過(guò)target獲取當(dāng)前點(diǎn)擊的元素li
ul.addEventListener('click',function(e){
var li = e.target;
})
target與currentTarget的區(qū)別:target是當(dāng)前點(diǎn)擊的元素侣监,currentTarget是綁定事件的元素;
為什么移動(dòng)端瀏覽普通網(wǎng)頁(yè)臣淤,點(diǎn)擊元素會(huì)有300毫秒延遲橄霉,如何解決
源于Safari瀏覽器的設(shè)定:用戶點(diǎn)擊后,為了判斷用戶是否雙擊縮放還是直接點(diǎn)擊邑蒋,會(huì)設(shè)置這個(gè)300ms延遲姓蜂,Safari之后,各大主流瀏覽器都遵從這個(gè)約定医吊,設(shè)置了延遲钱慢;
解決方式:如果禁用雙擊縮放,那么瀏覽器將不再檢查卿堂,所以要將user-scalable=0加入視口meta中
<meta name="viewport" content="user-scalable=0">
除此之外束莫,content的值若要兼容移動(dòng)端視圖懒棉,還需要加上width=device-width, initial-scale=1.0, maximum-scale=1.0屬性
移動(dòng)端1px問(wèn)題
電腦端的1PX,在不同尺寸的移動(dòng)端顯示不一樣
解決方式:同樣通過(guò)視口標(biāo)簽調(diào)整
<meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no"/>
JavaScript相關(guān)
this的指向
http://www.reibang.com/p/d0022f7c9e51
面向?qū)ο?- 原型鏈和基于原型鏈的繼承
原型鏈:http://www.reibang.com/p/10bb679b9044
繼承:http://www.reibang.com/p/368ca515de5d
什么是閉包
http://www.reibang.com/p/e1c68bb7ac6e
異步相關(guān)
回調(diào):http://www.reibang.com/p/c8b94eeed75a
手寫一個(gè)Promise: http://www.reibang.com/p/d36f6f5f3372
async/await:語(yǔ)法http://www.reibang.com/p/220b7f3469d5
MicroTask:微任務(wù)览绿,如setImmidiate策严、Promise和nextTick
MacroTask: setTimeout、setInterval
事件循環(huán):Micro/Macro任務(wù)全部執(zhí)行完畢后饿敲,才會(huì)進(jìn)行下一輪的任務(wù)妻导;
ES6特性
class語(yǔ)法糖、解構(gòu)賦值怀各、模板語(yǔ)法倔韭、箭頭函數(shù)、拓展運(yùn)算符渠啤、Symbol狐肢、Promise、生成器沥曹、async/await函數(shù)份名、原生對(duì)象新方法如Array.of,Object.assign妓美,新數(shù)據(jù)結(jié)構(gòu)Set僵腺、Map、WeakMap壶栋、WeakSet
模塊化和工程化
為什么需要模塊化
目前瀏覽器運(yùn)行的JavaScript沒(méi)有模塊的概念辰如,隨著Web應(yīng)用規(guī)模不斷擴(kuò)大,模塊的缺乏導(dǎo)致JavaScript代碼越來(lái)越難以維護(hù)贵试。具體表現(xiàn)為:
- 所有的變量琉兜、方法都在在全局作用域執(zhí)行,容易造成變量名沖突
- 不同功能的代碼雜糅在一起毙玻,難以進(jìn)行維護(hù)
- 依賴關(guān)系不明確豌蟋,即便可以將代碼分為多個(gè)文件,但是各個(gè)功能之間的代碼塊依然能夠相互影響桑滩,數(shù)據(jù)的變化難以追蹤
所以我們希望通過(guò)模塊化梧疲,達(dá)成一個(gè)目的:代碼分開(kāi)寫,相互不影響运准,后期好維護(hù)
CommonJS幌氮、AMD和CMD標(biāo)準(zhǔn)
CommonJS規(guī)范:
隨著Node.js的出現(xiàn),運(yùn)行在服務(wù)端的JavaScript比瀏覽器端更加復(fù)雜胁澳,加之Node.js提供了本地文件讀取的相關(guān)API(fs)该互,讓JavaScript模塊化成為可能。CommonJS規(guī)范具體為:
- 一個(gè)文件即是一個(gè)模塊听哭,例如:
src/
main.js <-入口文件
a.js <-模塊a
b.js <-模塊b
- 模塊的導(dǎo)入需要調(diào)用require函數(shù)慢洋,傳入模塊名(文件路徑或者依賴包名)同步加載
- 通過(guò)對(duì)
exports
或module.exports
賦值塘雳,暴露該模塊的數(shù)據(jù)
AMD規(guī)范
瀏覽器的腳本需要網(wǎng)絡(luò)請(qǐng)求獲取陆盘,無(wú)法像node.js一般快速普筹、同步加載,這時(shí)可以使用AMD(Asynchronous Modules Definition)規(guī)范隘马,異步加載代碼
require.js是遵循AMD規(guī)范的模塊導(dǎo)入工具太防,我們可以在瀏覽器中引入
<script src="path/to/require.js"></script>
通過(guò)調(diào)用define定義一個(gè)模塊,傳入當(dāng)前模塊ID酸员,依賴模塊ID列表和工廠函數(shù):
define(id?: string,?dependencies: string[], factory: Function)
define('moduleA', ['moduleB'], function(moduleB){
return {
getB :()=>moduleB
}
})
通過(guò)調(diào)用require函數(shù)蜒车,加載一個(gè)模塊:
require(['moduleA','moduleB'],function(moduleA,moduleB) {
// handle moduleA, moduleB
})
CMD(Common Module Definition)
與AMD頂頭依賴不同的是CMD遵循就近依賴原則(哪里用到點(diǎn)哪里)
// CMD
define(function(require, exports, module) {
var a = require('./a')
a.doSomething()
// 依賴可以就近書(shū)寫
var b = require('./b')
b.doSomething()
})
實(shí)現(xiàn)CMD 規(guī)范的工具是SeaJS,由玉伯大佬(現(xiàn)螞蟻金服體驗(yàn)技術(shù)部leader)開(kāi)發(fā)幔嗦。
目前AMD酿愧,CMD規(guī)范已經(jīng)逐步淡出模塊化的舞臺(tái)。
為什么需要工程化
- 模塊化將代碼拆分成許多文件邀泉,而運(yùn)行在瀏覽器的端的代碼卻需要減少請(qǐng)求次數(shù)
- 人的精力是有限的嬉挡,如果能通過(guò)機(jī)器去完成腳手架搭建、打包汇恤、發(fā)布等重復(fù)工作庞钢,能節(jié)省大量開(kāi)發(fā)者的時(shí)間。
總結(jié):工程化的目的是提高開(kāi)發(fā)效率
目前市面上有Grunt因谎、Gulp等構(gòu)建工具 』ǎ現(xiàn)如今,越來(lái)越多的開(kāi)發(fā)者選擇↓
Webpack
是目前最流行的前端構(gòu)建工具财岔,能夠?qū)⒈镜啬K化的html/css/js打包成瀏覽器能夠運(yùn)行的html/css/js风皿,解決了大型前端項(xiàng)目的幾個(gè)痛點(diǎn):
- 將開(kāi)發(fā)代碼和線上代碼隔離開(kāi),開(kāi)發(fā)時(shí)可以模塊化地編寫前端代碼匠璧,Webpack自動(dòng)將這些代碼塊聚合起來(lái)桐款,供瀏覽器運(yùn)行
- 不僅實(shí)現(xiàn)了模塊化,通過(guò)loader接口和各種插件患朱,使得開(kāi)發(fā)者在開(kāi)發(fā)時(shí)可以編寫諸如JSX鲁僚、Vue Template、TypeScript裁厅、ES6 module等需要預(yù)編譯的腳本冰沙,甚至是SASS/LESS預(yù)編譯樣式。
- 通過(guò)配置执虹,決定哪些文件需要參與構(gòu)建拓挥、哪些需要單獨(dú)導(dǎo)入,有較強(qiáng)的靈活性
webpack運(yùn)行原理
https://zhuanlan.zhihu.com/p/52826586
https://zhuanlan.zhihu.com/p/53044886
前端框架
為什么需要框架
- 可以在構(gòu)建復(fù)雜應(yīng)用時(shí)少寫很多行代碼
- 如果不使用框架袋励,開(kāi)發(fā)者需要操作DOM來(lái)更新頁(yè)面視圖侥啤〉卑龋框架能夠讓開(kāi)發(fā)者專注于自己的業(yè)務(wù)數(shù)據(jù)而非過(guò)多地操作DOM
- 操作DOM有額外的性能開(kāi)銷,需要一些框架來(lái)統(tǒng)一地管理DOM
- 框架的引入盖灸,不僅促進(jìn)了團(tuán)隊(duì)開(kāi)發(fā)的統(tǒng)一和規(guī)范蚁鳖,同時(shí)還提升開(kāi)發(fā)團(tuán)隊(duì)效率,更利于后期的維護(hù)和管理赁炎。
- 安全:使用虛擬DOM/字符串渲染可以避免大部分XSS攻擊醉箕;
淺談Vue、React和AngularJS的區(qū)別
- AngularJS:由google開(kāi)發(fā)徙垫。工具鏈完整讥裤、開(kāi)箱即用,provider姻报、service和contoller分層的思想與服務(wù)端開(kāi)發(fā)接近己英,缺點(diǎn):文件體積較大,不適合小微web頁(yè)面吴旋,1代的性能存在一定的問(wèn)題(2代不深入)损肛。
- ReactJS:由Facebook開(kāi)發(fā)。與Angular不同邮府,僅為view層的框架荧关,引入了虛擬DOM的思想,從而兼顧了性能和業(yè)務(wù)專注度褂傀,社區(qū)生態(tài)目前是最豐富的忍啤;
- Vue.js:同ReactJS框架一樣為view層框架,聲明式的HTML模板仙辟,輕量級(jí)同波,拓展性強(qiáng),容易上手
三大框架如何實(shí)現(xiàn)數(shù)據(jù)綁定
并不是這三個(gè)框架都使用雙向綁定
AngularJS:將用戶交互事件($ng-click)叠国、定時(shí)器($interval/$timeout)和Ajax請(qǐng)求($http)重新封裝未檩,調(diào)用了這些封裝的函數(shù),Angular會(huì)調(diào)用$apply觸發(fā)臟檢測(cè)粟焊,接著修改DOM冤狡。
ReactJS:使用State將數(shù)據(jù)渲染到視圖中,當(dāng)數(shù)據(jù)需要變化時(shí)調(diào)用setState方法项棠,react將決定什么時(shí)候重新渲染視圖(可以使用forceUpdate強(qiáng)制更新)悲雳,這也是為什么setState是異步的原因
VueJS:通過(guò)Object.defineProperty劫持data數(shù)據(jù),如此一來(lái)對(duì)象值發(fā)生變化香追,就會(huì)觸發(fā)getter/setter函數(shù)合瓢,通React一樣,vue也會(huì)將這些變化推入更新隊(duì)列中透典,由vue自己決定什么時(shí)候更新視圖(可以調(diào)用$nextTick傳入更新完畢后的回調(diào))晴楔。
Vue3.0:使用Proxy代替Object.defineProperty顿苇,O.d無(wú)法監(jiān)聽(tīng)對(duì)象上屬性的添加和創(chuàng)建,同時(shí)不能像Proxy一樣能夠直接在回調(diào)中訪問(wèn)對(duì)象自身/屬性和值(O.d的setter僅能獲取到set值)
網(wǎng)絡(luò)相關(guān)
如何解決跨域
http://www.reibang.com/p/eb2f3d92b0ae
HTTP狀態(tài)碼
- 1xx:請(qǐng)求正在處理税弃,一般不會(huì)返回給你
- 2xx:請(qǐng)求完成(200表示OK)
- 3xx: 重定向(301永久移動(dòng)纪岁,302臨時(shí)移動(dòng),304協(xié)商緩存钙皮,305需要代理)
- 4xx: 客戶端錯(cuò)誤(400參數(shù)錯(cuò)誤蜂科,401授權(quán)失敗顽决,403拒接響應(yīng)短条,404未找到,405請(qǐng)求方法錯(cuò)誤才菠,418勞資就是個(gè)茶杯 )
- 5xx: 服務(wù)端錯(cuò)誤(500服務(wù)器內(nèi)部錯(cuò)誤茸时,502網(wǎng)關(guān)有問(wèn)題,504網(wǎng)關(guān)超時(shí))
HTTP協(xié)議 TCP協(xié)議和UDP協(xié)議的區(qū)別
TCP和UDP是網(wǎng)絡(luò)傳輸層中應(yīng)用層的協(xié)議赋访,HTTP是TCP的一種可都。
TCP連接效率低但是穩(wěn)定,UDP速度快蚓耽,開(kāi)銷低但不穩(wěn)定(兩者互補(bǔ))
HTTPS
本質(zhì)是:本使用非對(duì)稱算法在客戶端/服務(wù)端之間協(xié)商獲得對(duì)稱密鑰
流程:
- client發(fā)起https請(qǐng)求
- server將申請(qǐng)過(guò)的渠牲、包含公鑰的證書(shū)(CA)返回給client,自己保存私鑰
- client通過(guò)服務(wù)端給的證書(shū)步悠,查詢CA該公鑰是否合法签杈。若合法,就用CA包含的公鑰生成一個(gè)對(duì)稱密鑰
- clilent將用公鑰加密后的對(duì)稱密鑰發(fā)給server
- server用私鑰解密對(duì)稱密鑰
- server返回對(duì)稱密鑰加密的內(nèi)容
- client使用對(duì)稱密鑰解密
- 此后客戶端/服務(wù)端均用對(duì)稱密鑰通信
DNS是什么鼎兽,用戶從輸入地址到瀏覽器返回頁(yè)面答姥,中間發(fā)生了什么
DNS基于UDP協(xié)議,是將url地址轉(zhuǎn)換為IP地址的方式谚咬。解析方式為遞歸查詢(這家沒(méi)有找下家)或迭代查詢(這級(jí)沒(méi)有找上級(jí))
輸入頁(yè)面 - DNS解析 - 找到目標(biāo)服務(wù)器并發(fā)送HTTP請(qǐng)求 - 三次握手傳輸報(bào)文鹦付,數(shù)據(jù)到達(dá)鏈路層 - 服務(wù)器接收并響應(yīng)結(jié)果 - 服務(wù)器返回內(nèi)容 - 瀏覽器開(kāi)始渲染文檔;
網(wǎng)絡(luò)請(qǐng)求方法
get post put delete等择卦,一般來(lái)說(shuō)敲长,get是獲取資源,因?yàn)間et可以被瀏覽器自動(dòng)緩存秉继,post為添加祈噪,put為修改,delete為刪除秕噪。get/delete沒(méi)有body钳降;post/put有;
性能相關(guān)
影響瀏覽器性能的因素(由高到低)
1.文件體積過(guò)大導(dǎo)致請(qǐng)求時(shí)間過(guò)長(zhǎng)或者服務(wù)端接口響應(yīng)過(guò)長(zhǎng)(后端躺槍)
2.頁(yè)面重繪與重排
3.過(guò)于頻繁地訪問(wèn)/修改DOM或者調(diào)用其方法腌巾。
服務(wù)端渲染
服務(wù)端通過(guò)URL請(qǐng)求遂填,直接返回HTML文檔而不是JSON數(shù)據(jù)铲觉,這樣做有一下優(yōu)勢(shì):
1.利于SEO(搜索引擎優(yōu)化)
2.極大提升首屏渲染速度,用戶體驗(yàn)較好(網(wǎng)頁(yè)打開(kāi)時(shí)間消耗較大的是http請(qǐng)求時(shí)間)
安全相關(guān)
XSS攻擊
網(wǎng)站對(duì)用戶的輸入不做任何限制吓坚,容易被人注入JavaScript腳本撵幽,如發(fā)表一則"<script>alert('666')</script>",服務(wù)端當(dāng)成正常的數(shù)據(jù)保存礁击,當(dāng)這些數(shù)據(jù)展示到HTML頁(yè)面時(shí)盐杂,這段文字就會(huì)當(dāng)成JavaScript腳本執(zhí)行。利用這個(gè)原理哆窿,向網(wǎng)站注入更復(fù)雜和危險(xiǎn)的腳本链烈,其危害和影響十分巨大。
CSRF攻擊
跨站偽造請(qǐng)求挚躯。例子:用戶登陸銀行支付系統(tǒng)强衡,卻手賤點(diǎn)開(kāi)了小廣告(釣魚(yú)頁(yè)面),發(fā)起轉(zhuǎn)賬請(qǐng)求码荔,釣魚(yú)頁(yè)面頁(yè)面抓取該請(qǐng)求并偽造一份請(qǐng)求漩勤,如果服務(wù)端不做處理,會(huì)造成二次甚至多次轉(zhuǎn)賬缩搅,給用戶造成損失越败。解決方法:token校驗(yàn)、驗(yàn)證碼校驗(yàn)硼瓣、短信校驗(yàn)等究飞。
DDos攻擊
使用多臺(tái)機(jī)器,大量且頻繁地向目標(biāo)服務(wù)器發(fā)送無(wú)用請(qǐng)求巨双,目標(biāo)服務(wù)器的資源和帶寬被DDos占用噪猾,無(wú)法處理正常請(qǐng)求甚至癱瘓。
SQL注入
原理通XSS筑累,通過(guò)表單輸入SQL語(yǔ)句袱蜡,服務(wù)端直接拼接,注入內(nèi)容當(dāng)成SQL語(yǔ)句執(zhí)行導(dǎo)致數(shù)據(jù)庫(kù)數(shù)據(jù)泄露慢宗、篡改和刪除等坪蚁。
服務(wù)端開(kāi)發(fā)
關(guān)系數(shù)據(jù)庫(kù)、非關(guān)系數(shù)據(jù)庫(kù)之間的區(qū)別
關(guān)系數(shù)據(jù)庫(kù):使用二維表組織镜沽、存儲(chǔ)數(shù)據(jù)敏晤,遵循ACID原則(原子性Atomicity、一致性Consistency缅茉、隔離性Isolation嘴脾、持久性Durability)的數(shù)據(jù)庫(kù)
代表:Oracle、SQLServer、MySQL译打、PostgreSQL
非關(guān)系數(shù)據(jù)庫(kù):使用key-value存儲(chǔ)耗拓,數(shù)據(jù)結(jié)構(gòu)靈活且不需要完全遵循ACID原則的數(shù)據(jù)庫(kù)
代表:MongoDB、Redis奏司、Memcache
RESTful接口
RESTful(Representational_state_transfer)乔询,是一種API接口的設(shè)計(jì)規(guī)范,參考:
http://www.ruanyifeng.com/blog/2014/05/restful_api.html