S Code 有個市場,提供很多插件,開發人員可以把它們安裝到文本編輯器,增強編輯器功能。在視圖菜單中,選擇擴展選項或按下 shift + cmd + X 即可進入市場。
善用 VS Code 插件,不僅節省時間,還能提高工作效率,讓你成為更好的開發人員。
該插件允許我們在更改 IDE 中的代碼時,自動重新加載 Web 頁面。
一旦安裝 Live Server 后,在 html 文件上右鍵單擊,可看到選項 Open with Live Server[Alt + L + Q]。
下載地址: Live Server
Quokka.js 會在你輸入時自動計算結果,并在 IDE 中打印結果。
下載地址: Quokka.js
它是一款拼寫檢查程序,可以為開發者報告一些常見的拼寫錯誤。它很適合駝峰式代碼。
下載地址: Code Spell Checker
GitLens 可增強 Visual Studio Code 中內置的 Git 功能。
它不僅能幫助你通過 Git blame 注解直觀地看到代碼作者,而且還可以無縫瀏覽和探索 Git 存儲庫,通過強大的比較命令獲得有價值的見解,等等。
下載地址: GitLens
Prettier 是一個嚴格基于規則的代碼格式化程序。
它解析代碼并使用自己的規則重新打印代碼,從而實現風格一致。這是一個重要的工具,無需開發人員做任何工作,它就能讓我們獲得格式正確的代碼。
Prettier 提供合理的默認值,但你也能在項目的根目錄下提供一個配置文件來設置自己的標準,比如行長度、制表符 / 空格的數量等等。
下載地址: Prettier
ESLint 是一款靜態代碼分析工具,用來識別 JavaScript 代碼中出現的有問題的模式。
ESLint 中的規則是可配置的,用戶可以定義和加載自己的規則。它還涵蓋了代碼質量和編碼風格問題。
下載地址: ESLint
該插件會基于文件擴展名在 the tree view 中的文件名旁添加圖標,讓你更容易地識別文件。
下載地址: vscode-icons
它能幫你實時把 SASS/SCSS 文件編譯 / 轉譯成 CSS 文件,并且提供在線瀏覽器重載。
下載地址: Live Saas Compiler
這個插件包含面向 VS Code 編輯器的 ES6 語法的 JavaScript 代碼片段(支持 JavaScript 和 TypeScript)。
下載地址: JavaScript (ES6) code snippets
它可以讓你在編輯器中打開一個用于調試的真正的瀏覽器預覽。
下載地址: Browser Preview
該擴展可以自動補全代碼中的路徑和文件名。
下載地址: Path Intellisense
這個擴展允許用顏色來標識匹配的括號。用戶可以定義要匹配的字符和要使用的顏色。
下載地址: Bracket Pair Colorizer
VSCodeVim 是一個用于 Visual Studio Code 的 Vim 仿真器,為你的文本編輯器帶來 Vim 的強大功能。
下載地址: VSCodeVim
高亮顯示代碼中的 TODO、FIXME 及其他注解。
下載地址: TODO Highlight
這個擴展可以風格化在你的文件中找到的 css/web 顏色,所以你無需打開頁面就能看到它們是什么顏色。
下載地址: Color Highlight
CSS in JS是一種解決css問題想法的集合,而不是一個指定的庫。從CSS in JS的字面意思可以看出,它是將css樣式寫在JavaScript文件中,而不需要獨立出.css、.less之類的文件。將css放在js中使我們更方便的使用js的變量、模塊化、tree-shaking。還解決了css中的一些問題,譬如:更方便解決基于狀態的樣式,更容易追溯依賴關系,生成唯一的選擇器來鎖定作用域。盡管CSS in JS不是一個很新的技術,但國內的普及程度并不高。由于Vue和Angular都有屬于他們自己的一套定義樣式的方案,React本身也沒有管用戶怎樣定義組件的樣式,所以CSS in JS在React社區的熱度比較高。
目前為止實現CSS in JS的第三方庫有很多:點擊這里。像JSS、styled-components等。在這里我們就不展開贅述了,這篇文章的重點是JS in CSS。
在上面我們提到CSS in JS就是把CSS寫在JavaScript中,那么JS in CSS我們可以推斷出就是可以在CSS中使用JavaScript腳本,如下所示??梢栽贑SS中編寫Paint API的功能。還可以訪問:ctx,geom。甚至我們還可以編寫自己的css自定義屬性等。這些功能的實現都基于CSS Houdini。
.el {
--color: cyan;
--multiplier: 0.24;
--pad: 30;
--slant: 20;
--background-canvas: (ctx, geom)=> {
let multiplier=var(--multiplier);
let c=`var(--color)`;
let pad=var(--pad);
let slant=var(--slant);
ctx.moveTo(0, 0);
ctx.lineTo(pad + (geom.width - slant - pad) * multiplier, 0);
ctx.lineTo(pad + (geom.width - slant - pad) * multiplier + slant, geom.height);
ctx.lineTo(0, geom.height);
ctx.fillStyle=c;
ctx.fill();
};
background: paint(background-canvas);
transition: --multiplier .4s;
}
.el:hover {
--multiplier: 1;
}
在如今的Web開發中,JavaScript幾乎占據了項目代碼的大部分。我們可以在項目開發中使用ES 2020、ES2021、甚至提案中的新特性(如:Decorator),即使瀏覽器尚未支持,也可以編寫Polyfill或使用Babel之類的工具進行轉譯,讓我們可以將最新的特性應用到生產環境中(如下圖所示)。
而CSS就不同了,除了制定CSS標準規范所需的時間外,各家瀏覽器的版本、實戰進度差異更是曠日持久(如下圖所示),最多利用PostCSS、Sass等工具來幫我們轉譯出瀏覽器能接受的CSS。開發者們能操作的就是通過JS去控制DOM與CSSOM來影響頁面的變化,但是對于接下來的Layout、Paint與Composite就幾乎沒有控制權了。為了解決上述問題,為了讓CSS的魔力不再受到瀏覽器的限制,Houdini就此誕生。
我們上文中提到JavaScript中進入提案中的特性我們可以編寫Polyfill,只需要很短的時間就可以講新特性投入到生產環境中。這時,腦海中閃現出的第一個想法就是CSS Polyfill,只要CSS的Polyfill 足夠強大,CSS或許也能有JavaScript一樣的發展速度,令人可悲的是編寫CSS Polyfill異常的困難,并且大多數情況下無法在不破壞性能的情況下進行。這是因為JavaScript是一門動態腳本語言。它帶來了極強的擴展性,正是因為這樣,我們可以很輕松使用JavaScript做出JavaScript的Polyfill。但是CSS不是動態的,在某些場景下,我們可以在編譯時將一種形式的CSS的轉換成另一種(如PostCSS)。如果你的Polyfill依賴于DOM結構或者某一個元素的布局、定位等,那么我們的Polyfill就無法編譯時執行,而需要在瀏覽器中運行了。不幸的是,在瀏覽器中實現這種方案非常不容易。
如上圖所示,是從瀏覽器獲取到HTML到渲染在屏幕上的全過程,我們可以看到只有帶顏色(粉色、藍色)的部分是JavaScript可以控制的環節。首先我們根本無法控制瀏覽器解析HTML與CSS并將其轉化為DOM與CSSOM的過程,以及Cascade,Layout,Paint,Composite我們也無能為力。整個過程中我們唯一完全可控制的就是DOM,另外CSSOM部分可控。
CSS Houdini草案中提到,這種程度的暴露是不確定的、兼容性不穩定的以及缺乏對關鍵特性的支持的。比如,在瀏覽器中的 CSSOM 是不會告訴我們它是如何處理跨域的樣式表,而且對于瀏覽器無法解析的 CSS 語句它的處理方式就是不解析了,也就是說——如果我們要用 CSS polyfill 讓瀏覽器去支持它尚且不支持的屬性,那就不能在 CSSOM 這個環節做,我們只能遍歷一遍DOM,找到 <style> 或 <link rel="stylesheet"> 標簽,獲取其中的 CSS 樣式、解析、重寫,最后再加回 DOM 樹中。令人尷尬的是,這樣DOM樹全部刷新了,會導致頁面的重新渲染(如下如所示)。
即便如此,有的人可能會說:“除了這種方法,我們也別無選擇,更何況對網站的性能也不會造成很大的影響”。那么對于部分網站是這樣的。但如果我們的Polyfill是需要對可交互的頁面呢?例如scroll,resize,mousemove,keyup等等,這些事件隨時會被觸發,那么意味著隨時都會導致頁面的重新渲染,交互不會像原本那樣絲滑,甚至導致頁面崩潰,對用戶的體驗也極其不好。
綜上所述,如果我們想讓瀏覽器解析它不認識的樣式(低版本瀏覽器使用grid布局),然而渲染流程我們無法介入,我們也只能通過手動更新DOM的方式,這樣會帶來很多問題,Houdini的出現正是致力于解決他們。
Houdini是一組底層API,它公開了CSS引擎的各個部分,如下圖所示展示了每個環節對應的新API(灰色部分各大瀏覽器還未實現),從而使開發人員能夠通過加入瀏覽器渲染引擎的樣式和布局過程來擴展CSS。Houdini是一群來自Mozilla,Apple,Opera,Microsoft,HP,Intel和Google的工程師組成的工作小組設計而成的。它們使開發者可以直接訪問CSS對象模型(CSSOM),使開發人員可以編寫瀏覽器可以解析為CSS的代碼,從而創建新的CSS功能,而無需等待它們在瀏覽器中本地實現。
盡管當前已經有了CSS變量,可以讓開發者控制屬性值,但是無法約束類型或者更嚴格的定義,CSS Houdini新的API,我們可以擴展css的變量,我們可以定義CSS變量的類型,初始值,繼承。它是css變量更強大靈活。
CSS變量現狀:
.dom {
--my-color: green;
--my-color: url('not-a-color'); // 它并不知道當前的變量類型
color: var(--my-color);
}
Houdini提供了兩種自定義屬性的注冊方式,分別是在js和css中。
CSS.registerProperty({
name: '--my-prop', // String 自定義屬性名
syntax: '<color>', // String 如何去解析當前的屬性,即屬性類型,默認 *
inherits: false, // Boolean 如果是true,子節點將會繼承
initialValue: '#c0ffee', // String 屬性點初始值
});
我們還可以在css中注冊,也可以達到上面的效果
@property --my-prop {
syntax: '<color>';
inherits: false;
initial-value: #c0ffee;
}
這個API中最令人振奮人心的功能是自定義屬性上添加動畫,像這樣:transition: --multiplier 0.4s;,這個功能我們在前面介紹什么是js in css那個demo用使用過。我們還可以使用+使syntax屬性支持一個或多個類型,也可以使用|來分割。更多syntax屬性值:
屬性值 | 描述 |
<length> | 長度值 |
<number> | 數字 |
<percentage> | 百分比 |
<length-percentage> | 長度或百分比,calc將長度和百分比組成的表達式 |
<color> | 顏色 |
<image> | 圖像 |
<url> | 網址 |
<integer> | 整數 |
<angle> | 角度 |
<time> | 時間 |
<resolution> | 分辨率 |
<transform-list> | 轉換函數 |
<custom-ident> | ident |
Worklets是渲染引擎的擴展,從概念上來講它類似于Web Workers,但有幾個重要的區別:
Worklet是一個JavaScript模塊,通過調用worklet的addModule方法(它是個Promise)來添加。比如registerLayout, registerPaint, registerAnimator 我們都需要放在Worklet中
//加載單個
await demoWorklet.addModule('path/to/script.js');
// 一次性加載多個worklet
Promise.all([
demoWorklet1.addModule('script1.js'),
demoWorklet2.addModule('script2.js'),
]).then(results=> {});
registerDemoWorklet('name', class {
// 每個Worklet可以定義要使用的不同函數
// 他們將由渲染引擎在需要時調用
process(arg) {
return !arg;
}
});
Worklets的生命周期
Typed OM是對現有的CSSOM的擴展,并實現 Parsing API 和 Properties & Values API相關的特性。它將css值轉化為有意義類型的JavaScript的對象,而不是像現在的字符串。如果我們嘗試將字符串類型的值轉化為有意義的類型并返回可能會有很大的性能開銷,因此這個API可以讓我們更高效的使用CSS的值。
現在讀取CSS值增加了新的基類CSSStyleValue,他有許多的子類可以更加精準的描述css值的類型:
子類 | 描述 |
CSSKeywordValue | CSS關鍵字和其他標識符(如inherit或grid) |
CSSPositionValue | 位置信息 (x,y) |
CSSImageValue | 表示圖像的值屬性的對象 |
CSSUnitValue | 表示為具有單個單位的單個值(例如50px),也可以表示為沒有單位的單個值或百分比 |
CSSMathValue | 比較復雜的數值,比如有calc,min和max。這包括子類 CSSMathSum, CSSMathProduct, CSSMathMin, CSSMathMax, CSSMathNegate 和 CSSMathInvert |
CSSTransformValue | 由CSS transforms組成的CSSTransformComponent列表,其中包括CSSTranslate, CSSRotate, CSSScale, CSSSkew, CSSSkewX, CSSSkewY, CSSPerspective 和 CSSMatrixComponent |
使用Typed OM主要有兩種方法:
使用attributeStyleMap設置并獲取
myElement.attributeStyleMap.set('font-size', CSS.em(2));
myElement.attributeStyleMap.get('font-size'); // CSSUnitValue { value: 2, unit: 'em' }
myElement.attributeStyleMap.set('opacity', CSS.number(.5));
myElement.attributeStyleMap.get('opacity'); // CSSUnitValue { value: 0.5, unit: 'number' };
在線demo
使用computedStyleMap
.foo {
transform: translateX(1em) rotate(50deg) skewX(10deg);
vertical-align: baseline;
width: calc(100% - 3em);
}
const cs=document.querySelector('.foo').computedStyleMap();
cs.get('vertical-align');
// CSSKeywordValue {
// value: 'baseline',
// }
cs.get('width');
// CSSMathSum {
// operator: 'sum',
// length: 2,
// values: CSSNumericArray {
// 0: CSSUnitValue { value: -90, unit: 'px' },
// 1: CSSUnitValue { value: 100, unit: 'percent' },
// },
// }
cs.get('transform');
// CSSTransformValue {
// is2d: true,
// length: 3,
// 0: CSSTranslate {
// is2d: true,
// x: CSSUnitValue { value: 20, unit: 'px' },
// y: CSSUnitValue { value: 0, unit: 'px' },
// z: CSSUnitValue { value: 0, unit: 'px' },
// },
// 1: CSSRotate {...},
// 2: CSSSkewX {...},
// }
復制代碼
在線demo
開發者可以通過這個API實現自己的布局算法,我們可以像原生css一樣使用我們自定義的布局(像display:flex, display:table)。在 Masonry layout library 上我們可以看到開發者們是有多想實現各種各樣的復雜布局,其中一些布局光靠 CSS 是不行的。雖然這些布局會讓人耳目一新印象深刻,但是它們的頁面性能往往都很差,在一些低端設備上性能問題猶為明顯。
CSS Layout API 暴露了一個registerLayout方法給開發者,接收一個布局名(layout name)作為后面在 CSS中使用的屬性值,還有一個包含有這個布局邏輯的JavaScript類。
my-div {
display: layout(my-layout);
}
// layout-worklet.js
registerLayout('my-layout', class {
static get inputProperties() { return ['--foo']; }
static get childrenInputProperties() { return ['--bar']; }
async intrinsicSizes(children, edges, styleMap) {}
async layout(children, edges, constraints, styleMap) {}
});
await CSS.layoutWorklet.addModule('layout-worklet.js');
在線demo 目前瀏覽器大部分還不支持
我們可以在CSS background-image中使用它,我們可以使用Canvas 2d上下文,根據元素的大小控制圖像,還可以使用自定義屬性。
await CSS.paintWorklet.addModule('paint-worklet.js');
registerPaint('sample-paint', class {
static get inputProperties() { return ['--foo']; }
static get inputArguments() { return ['<color>']; }
static get contextOptions() { return {alpha: true}; }
paint(ctx, size, props, args) { }
});
在線demo
這個API讓我們可以控制基于用戶輸入的關鍵幀動畫,并且以非阻塞的方式。還能更改一個 DOM 元素的屬性,不過是不會引起渲染引擎重新計算布局或者樣式的屬性,比如 transform、opacity 或者滾動條位置(scroll offset)。Animation API的使用方式與 Paint API 和 Layout API略有不同我們還需要通過new一個WorkletAnimation來注冊worklet。
// animation-worklet.js
registerAnimator('sample-animator', class {
constructor(options) {
}
animate(currentTime, effect) {
effect.localTime=currentTime;
}
});
await CSS.animationWorklet.addModule('animation-worklet.js');
// 需要添加動畫的元素
const elem=document.querySelector('#my-elem');
const scrollSource=document.scrollingElement;
const timeRange=1000;
const scrollTimeline=new ScrollTimeline({
scrollSource,
timeRange,
});
const effectKeyframes=new KeyframeEffect(
elem,
// 動畫需要綁定的關鍵幀
[
{transform: 'scale(1)'},
{transform: 'scale(.25)'},
{transform: 'scale(1)'}
],
{
duration: timeRange,
},
);
new WorkletAnimation(
'sample-animator',
effectKeyframes,
scrollTimeline,
{},
).play();
關于此API的更多內容點擊這里
允許開發者自由擴展 CSS 詞法分析器。
解析規則:
const background=window.cssParse.rule("background: green");
console.log(background.styleMap.get("background").value) // "green"
const styles=window.cssParse.ruleSet(".foo { background: green; margin: 5px; }");
console.log(styles.length) // 5
console.log(styles[0].styleMap.get("margin-top").value) // 5
console.log(styles[0].styleMap.get("margin-top").type) // "px"
解析CSS:
const style=fetch("style.css")
.then(response=> CSS.parseStylesheet(response.body));
style.then(console.log);
它將提供一些方法來測量在屏幕上呈現的文本元素的尺寸,將允許開發者控制文本元素在屏幕上呈現的方式。使用當前功能很難或無法測量這些值,因此該API將使開發者可以更輕松地創建與文本和字體相關的CSS特性。例如:
了解到這里,部分開發者可能會說:“我不需要這些花里胡哨的技術,并不能帶收益。我只想簡簡單單地寫幾個頁面,做做普通的Web App,并不想試圖干預瀏覽器的渲染過程從而實現一些實驗性或炫酷的功能。”如果這樣想的話,我們不妨退一步再去思考。回憶下最近做過的項目,用于實現頁面效果所使用到的技術,grid布局方式在考慮兼容老版本瀏覽器時也不得不放棄。我們想控制瀏覽器渲染頁面的過程并不是僅僅為了炫技,更多的是為了幫助開發者們解決以下兩個問題:
幾年過后再回眸,當主流瀏覽器完全支持Houdini的時候。我們可以在瀏覽器上隨心所欲的使用任何CSS屬性,并且他們都能完美支持。像今天的grid布局在舊版本瀏覽器支持的并不友好的這類問題,那時我們只需要安裝對應的Polyfill就能解決類似的問題。
如在文中發現有誤之處,歡迎反饋、糾正。
態伺服器網頁(英文:Active Server Pages,簡稱ASP),由微軟公司開發的服務器端運行的腳本平臺,它被Windows下Internet Information Services (IIS)的程式所管理。透過ActiveX server的技術讓不同的使用者能有不同的畫面,或需要讓他們可以存取服務器(server)上的資料時,使用ASP3.0中提供了五個內建的物件建立模擬和安全性的動態內容,來協助程序員隱藏復雜的溝通機制,讓程序員可以專注在解決問題和應用之上,這樣可以更快速地開發動態網頁的同時每一個組件都是可以由一組富有經驗的程序員根據動態網頁最常用的功能而獨立開發。
ASP的特色
ASP隱藏了網頁伺服器與瀏覽者之間溝通的繁瑣機制的同時也基于script base的特性,網頁撰寫員可以專心撰寫應用的程式的邏輯部份,再者ASP也像HTML般透過撰寫程序來即時測試網頁是否安全地運行,而不必擔心程式和伺服器不能溝通的問題,另外因為那些script是于發送前于伺服器中先行轉譯處理成為HTML后再而發送至代理伺服器邊的動態網頁技術,不必擔心瀏覽器的支援性及,網頁撰寫員的程式邏輯像client-side script會被盜用,因此最終瀏覽者只會是使用HTML來瀏覽。
利用ASP程序最常用的是Cookies,它利用Session組件實現的。同時還可以利用第三方組件延伸ASP的作用,如利用MailSender組件發送電子郵件。
通過ASP,可以結合HTML網頁、ASP指令和ActiveX元件建立動態、交互且高效的WEB服務器應用程序。同時,ASP也支持VBScript和JScript等腳本語言,默認為VBScript,而其中JScript是微軟公司的ECMAScript標準的實現,并且有自己的擴展。
五個內建組件
Application:在一個ASP-based application讓不同使用者共享資訊。
Request:從使用者處理取得資訊
Response:將資訊送給使用者
Server:提供一些Web Server的工具
Session:儲存在一個session內使用者的資訊
物件的支援
ASP對COM的支援會允許撰寫員使用server component(或OLE Automation server)。透過它撰寫員可以發展自己的物件,或將把程式轉成Web-base的介面。
透過ADO提供對于資料庫的應用。
透過ActiveX的Scripting.FileSystemObject提供對于檔案的操作。
狀態(State)的管理
狀態管理是ASP的重要功能之一,原因為HTTP是一個stateless的協定,當有匿名的request進入時,瀏覽者無法辨認這些的request是否安全,或那些request之間的關連性時,便無法透過瀏覽者取得資訊如帳戶及密碼等,對交易特性的Web應用程式造成了阻礙。因此ASP透過cookie的包裝和使用讓瀏覽者可以簡單地管理眾多使用者名稱的不同狀態。
版本
ASP目前最新的版本為3.0,與Windows 2000一起發行,并內植于IIS 5.0中。
ASP 1.0內含于Windows NT 4.0 Service Pack 3(IIS 3.0)發行。
ASP 2.0內含于Windows NT 4.0 Option Pack,與IIS 4.0一起亮相。
自ASP 3.0發行后,除了各版本對它的安全性或問題修補外,對主要功能都沒有再進一步的更新。 Windows Server 2003發行的ASP也是3.0版本。
其后繼者ASP+(即ASP.NET),已內含于.NET Framework中持續演化。
原理
ASP是經過服務器解析之后再向網頁瀏覽器返回數據,所以有了ASP就不必擔心客戶的瀏覽器是否能運行你所編寫的代碼。因為所有的程序都將在網頁服務器端執行,包括所有嵌在普通HTML中的腳本程序。當程序執行完畢后,服務器僅將執行的結果返回給客戶瀏覽器,這樣也就減輕了客戶端瀏覽器的負擔,大大提高了交互的速度。
由于代碼是需要經過服務器執行之后才向瀏覽器發送的,所以在客戶端看到的只能是經過解析之后的數據,而無法獲得源代碼,故編寫者不用擔心自己的源代碼會被別人剽竊。但不排除黑客利用系統漏洞竊取服務器端的ASP源代碼。
基于這樣的解析方式,也導致運行ASP頁面相對于普通的HTML頁面要慢一點。因為普通的HTML頁面只需要瀏覽器就能夠解析,而ASP則必須是服務器將整頁的代碼都執行一遍之后再發送數據。
ASP提供與數據庫的交互,如Microsoft SQL Server、Microsoft Access、MySQL和Oracle,比較流行的是ASP和Microsoft SQL Server的組合。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。