Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
文轉自:https://www.jianshu.com/p/8f064d69d206
前端開發人員和技術人員的數量逐年增加,而整個生態系統渴望實現標準化。新技術和工具的出現已經改變了游戲規則。可以肯定地說,總體趨勢將是 UI 標準化、基于組件的模塊化和組合,這將影響從樣式到測試甚至狀態管理的所有方面,并在總體上實現更好的模塊化。
JavaScript世界日新月異。
前端開發(和 web 開發)的世界正在以驚人的速度發展。今天,如果你沒有領先,或者不是 Webpack、React Hooks、Jest、Vue 和 NG elements,你就會開始感覺到差距在擴大。但是,情況正在發生變化。
前端開發人員和技術人員的數量逐年增加,而整個生態系統渴望實現標準化。新技術和工具的出現已經改變了游戲規則。
可以肯定地說,總體趨勢將是 UI 標準化、基于組件的模塊化和組合,這將影響從樣式到測試甚至狀態管理的所有方面,并在總體上實現更好的模塊化。這將包括圍繞 Web 組件、ES 模塊、面向組件的樣式或狀態管理工具等構建的技術。
本文是我個人對未來幾年前端發展狀況的一種簡短而片面的觀察。當然,它遺漏了很多東西,所以請盡管在評論區發表你的見解。
框架無關的 Web 組件
基本上,這就是未來。為什么?因為這些純 Web 組件與框架無關,可以在沒有框架的情況下工作,這意味著標準化。因為它們不會帶來 JS 疲勞,并且受到現代瀏覽器的支持。因為它們的包大小和資源消耗將是最優的,而且 VDOM 渲染令人興奮。
這些組件提供自定義元素、Javascript API(允許定義一種新的 HTML 標簽)、HTML 模板(用于指定布局),當然還有影子 DOM(本質上是特定于組件的)。
在這個領域中,需要了解的主要工具包括 Lit-html (和 Lit-element )、 StencilJS 、 SvelteJS ,當然還有 Bit ,它們都是面向可重用的模塊化組件,而這些組件可以在任何地方直接共享、使用和開發。
當考慮 UI 開發的未來,以及組件時代的模塊化、重用性、封裝和標準化原則時,Web 組件就是答案。
框架戰爭的未來?
是的,在 NPM 下載中,React 目前仍然是女皇
所以我們不會深入探討“誰更好,為什么更好”,你可以下文中了解到關于這個問題的更多答案。相反,我們將后退一步,看看更大的圖景。圍繞組件的前端技術的總體“市場份額”正在不斷增長。新開發人員的加入速度也在快速增長,工具的采用空間也越來越大。
那么,從現在開始的 5 年內,哪個框架會占據統治地位呢?沒有人知道。但是,可以肯定地說,在原生 JS 生態系統中,這將是一個大有可為的方面。在這個生態系統中,Web 組件統治了 DOM。React 居 NPM 下載量之后。然而,看看 這些數字 。在實際的 Web 使用中,差距似乎非常小。
令人震驚的,對吧?
實際上,Vue 和 React 在實際應用中非常接近
隨著未來與框架無關的 Web 組件的標準化,人們可能想知道它可能對 UI 框架戰爭產生什么樣的影響。是的,我們知道,React 不是一個框架……
組件隔離、重用和組合
heBit 組件:未來的代碼共享、重用和開發
當談到在不久的將來的前端開發和 UI 組件時,我們不可能忽視 Bit 令人驚喜的承諾和功能。
Bit(開源) 隔離并將組件(或任何可重用的 JS 代碼)轉換為共享的構建塊,你可以在所有項目和應用程序中使用和共享這些構建塊。神奇的是,你還可以使用 Bit 開發不同項目的相同組件,同時完全控制源代碼更改和整個依賴關系圖。
簡單地說,使用 Bit,你可以立即在一個項目中使用來自另一個項目的組件,開發和更改來自兩個項目的組件,并同步更改。當作為一個團隊工作時,這個工作流將通過 bit.dev (Bit 的組件中心)得到增強,你可以在其中組織和共享你的團隊代碼。
組件中心提供了組件共享和協作所需的一切,從出色的搜索和發現體驗到在線組件試用、完整的 CI/CD 支持等等。
使用 Bit,你構建的應用程序可以完全實時地訪問你的團隊和開源社區編寫的所有組件,并立即共享新組件或建議對現有組件進行更新。
ES 模塊和 CDN
ES 模塊是在瀏覽器中使用模塊的標準,由 ECMAScript 標準化。使用 ES 模塊可以很容易地將功能封裝到模塊中,這些模塊可以通過 CDN 等方式使用。隨著 Firefox 60 的發布, 所有主流瀏覽器都將支持 ES 模塊 ,Node 團隊正在努力將 ES 模塊支持添加到 Node.js 中。另外, 面向 WebAssembly 的 ES 模塊集成 將在未來幾年實現。想象一下,利用 Bit 隔離的 JS 組件,依托 bit.dev 通過 CDN 使用。
組件級狀態管理
那么,狀態管理有什么新變化?最終,我們會遍歷 Redux 全球商店中的所有東西?
但是,這可能使充分利用組件的模塊化和可重用性變得困難。從這個角度來看,像 MobX 這樣的項目提供了一種有趣的、更具反應性的方法(也可以看下 Unstated 項目)。React 的新 Context API 和 Hooks 意味著你不需要第三方庫,可以在功能組件級管理狀態,提高模塊性和可重用性。
因此,展望未來,嘗試更多地從封裝組件的角度來考慮狀態管理,而不是從全局應用程序存儲的角度來考慮。
可組合樣式化組件
借助 Bit 模塊化:獨立的邏輯和主題組件組合成你的樣式
所以在過去的兩年里,有很多關于“樣式化組件(styling components)”的討論。從內聯 CSS 或 CSS 模塊到 JS 和樣式組件中的 CSS,甚至還有像 stylable 這樣的讓步解決方案,選項很多。
在考慮未來幾年的樣式化時,我喜歡把樣式化當作一種組合。也就是說,我們的 組件設計系統應該同時包含邏輯組件和主題組件,這些組件可以使用 Bit 之類的工具組合在一起。通過這種方式,你可以創建一個設計系統,根據需要進行演進和更改,而不會將一個繁瑣的庫強加給不愿意采用它的開發人員。設計工具本身,比如 Sketch an Figma,將利用組件來達到這個目的(將它們與 Bit 結合起來,就得到了最終的組件設計系統)。這非常令人興奮。
因此,使用 GraphQL 通過組件為客戶端提供了令人興奮的可能性。使用 Apollo ,你可以輕松構建通過 GraphQL 獲取數據的 UI 組件。結合 Bit,你可以直接從正在使用組件的項目導入和開發這些組件。
通過對 API 的智能管理,可以簡化圍繞數據驅動應用開發的工作流,加快開發速度。所以,展望未來,這絕對是值得的。
基于組件的設計工具
隨著 組件成為我們的設計系統 ,設計人員和開發人員之間的鴻溝將被彌合。從設計人員和開發人員的角度來看,這都是可能的。
Sketch 已經在設計組件之間創建了依賴關系鏈接,因此,你可以以模塊化的方式設計和更新設計。 代碼組件的集成 已經開始出現,這只是時間問題。 Figma 之類的工具是基于可重用的 UI 元素構建的。 Framer 團隊 正在為編寫代碼的設計人員構建一個工具,在一定程度上控制將 UI 元素轉換為可重用的 React 組件。通過 Bit ,你可以將你設計的組件轉換為可重用的構建塊,這些構建塊可以在任何地方被可視化地發現、使用甚至開發,從而彌合與開發人員之間的鴻溝。Bit + 組件設計工具未來將產生很大的影響。通過 CDN 使用 Bit 和 Web 組件意味著全面的組合。
要講解爬蟲相關的知識如:http、網頁、爬蟲法律等,讓大家對爬蟲有了一個比較完善的了解和一些題外的知識點。
今天這篇文章,我們從今天開始就正式進入實戰階段,后面將會有更多的實際案例。
為大家講解了HTTP原理,很多人好奇:好好的講爬蟲和HTTP有什么關系?其實我們常說的爬蟲(也叫網絡爬蟲)就是使用一些網絡協議發起的網絡請求,而目前使用最多的網絡協議便是HTTP/S網絡協議簇。
在真實瀏覽網頁我們是通過鼠標點擊網頁然后由瀏覽器幫我們發起網絡請求,那在Python中我們又如何發起網絡請求的呢?答案當然是庫,具體哪些庫?豬哥給大家列一下:
Python網絡請求庫有點多,而且還看見網上還都有用過的,那他們之間有何關系?又該如何選擇?
綜上所述,我們選擇選擇requests庫作為我們爬蟲入門的起點。另外以上的這些庫都是同步網絡庫,如果需要高并發請求的話可以使用異步網絡庫:aiohttp,這個后面豬哥也會為大家講解。
希望大家永遠記?。簩W任何一門語言,都不要忘記去看看官方文檔。也許官方文檔不是最好的入門教程,但絕對是最新、最全的教學文檔!
requests的官方文檔(目前已支持中文)
從首頁中讓HTTP服務人類這幾個字中我們便能看出,requests核心宗旨便是讓用戶使用方便,間接表達了他們設計優雅的理念。
注:PEP 20便是鼎鼎大名的Python之禪。
警告:非專業使用其他 HTTP 庫會導致危險的副作用,包括:安全缺陷癥、冗余代碼癥、重新發明輪子癥、啃文檔癥、抑郁、頭疼、甚至死亡。
都說requests功能強大,那我們來看看requests到底有哪些功能特性吧:
requests 完全滿足今日 web 的需求。Requests 支持 Python 2.6—2.7以及3.3—3.7,而且能在 PyPy 下完美運行
pip install requests
如果是pip3則使用
pip3 install requests
如果你使用anaconda則可以
conda install requests
如果你不想用命令行,可在pycharm中這樣下載庫
下圖是豬哥之前工作總結的一個項目開發流程,算是比較詳細,在開發一個大型的項目真的需要這么詳細,不然項目上線出故障或者修改需求都無法做項目復盤,到時候程序員就有可能背鍋祭天。。。
言歸正傳,給大家看項目的開發流程是想引出爬蟲爬取數據的流程:
起點中文網創建于2002年5月,是國內最大文學閱讀與寫作平臺之一,是國內領先的原創文學門戶網站,隸屬于國內最大的數字內容綜合平臺——閱文集團旗下。
總體思路分為三步:
1.分析網頁結構,利用xpath表達式爬取到所有的文章名字與鏈接,并按文章名字生成文件夾。
import requests
from urllib import request
from lxml import etree
import os
header={
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'}
class Spider(object):
def start_request(self):
url='https://www.qidian.com/all'
req=request.Request(url,headers=header)
html=request.urlopen(req).read().decode('utf-8')
html=etree.HTML(html)
bigtit_list=html.xpath('//div[@class="book-mid-info"]/h4/a/text()') ##爬取所有的文章名字
bigsrc_list=html.xpath('//div[@class="book-mid-info"]/h4/a/@href')
print(bigtit_list)
print(bigsrc_list)
for bigtit,bigsrc in zip(bigtit_list,bigsrc_list):
if os.path.exists(bigtit)==False:
os.mkdir(bigtit)
self.file_data(bigsrc,bigtit)
2.利用文章鏈接,爬取每個章節名字與鏈接
def file_data(self,bigsrc,bigtit): #詳情頁
url="http:"+bigsrc
req=request.Request(url, headers=header)
html=request.urlopen(req).read().decode('utf-8')
html=etree.HTML(html)
print(html)
Lit_tit_list=html.xpath('//ul[@class="cf"]/li/a/text()') #爬取每個章節名字
Lit_href_list=html.xpath('//ul[@class="cf"]/li/a/@href') #每個章節鏈接
for tit,src in zip(Lit_tit_list,Lit_href_list):
self.finally_file(tit,src,bigtit)
3.利用每個章節的鏈接,生成帶有章節名稱的txt文件,并保存到每個文章文件夾下。
def finally_file(self,tit,src,bigtit):
url="http:" + src
req=request.Request(url, headers=header)
html=request.urlopen(req).read().decode('utf-8')
html=etree.HTML(html)
text_list=html.xpath('//div[@class="read-content j_readContent"]/p/text()')
text="\n".join(text_list)
file_name=bigtit + "\\" + tit + ".txt"
print("正在抓取文章:" + file_name)
with open(file_name, 'a', encoding="utf-8") as f:
f.write(text)
spider=Spider()
spider.start_request()
成功!
生成的文件夾如下圖:
家好,很高興又見面了,我是"高級前端?進階?",由我帶著大家一起關注前端前沿、深入前端底層技術,大家一起進步,也歡迎大家關注、點贊、收藏、轉發,您的支持是我不斷創作的動力。
今天給大家帶來的主題是Lit ,即一個簡單的庫,用于構建快速、輕量級的 Web Component。話不多說,直接進入正題!
Lit 是一個簡單的庫,用于構建快速、輕量級的 Web Component。 Lit 的核心是一個消除樣板的組件基類,它提供反應式狀態、作用域樣式和一個微小、快速且富有表現力的聲明性模板系統。
Lit 具有以下優勢:
除了以上特點外,Lit 的優勢還包括:
目前 Lit 在 Github 上通過 BSD-3-Clause 協議開源,有超過 15.1k 的 star、0.8k 的 fork、38.1k 的項目依賴量,代碼貢獻者 160+,npm 周平均下載量 845k,是一個妥妥的前端優質開源項目,值得長期關注。
開發者可以使用 Lit 構建幾乎任何類型的 Web UI!
每個 Lit 組件都是標準的 Web 組件。 Web 組件具有互操作性的超強能力,本身受瀏覽器的支持,可以在任何 HTML 環境中使用,可以使用任何框架,也可以不依賴框架。
這使得 Lit 成為開發可共享組件或設計系統的理想選擇。 Lit 組件可以跨多個應用程序和站點使用,即使這些應用程序和站點構建在各種前端堆棧上。 使用 Lit 組件的站點開發人員不需要編寫甚至不需要查看任何 Lit 代碼,可以像使用內置 HTML 元素一樣使用這些組件。
Lit 還非常適合用于逐步增強基本 HTML 網站。 瀏覽器將識別標記中的 Lit 組件并自動初始化, 無論站點是手工制作的、通過 CMS 管理的、使用服務器端框架構建的,還是由 Jekyll 或 Eleventy 等工具生成的。
當然,開發者也可以使用 Lit 組件構建高度交互、功能豐富的應用程序,就像使用 React 或 Vue 等框架一樣。 Lit 的功能和開發人員體驗與這些流行的替代方案相當,但 Lit 通過采用瀏覽器的本機組件模型最大限度地減少鎖定、最大限度地提高靈活性并提高可維護性。
總結起來,Lit 非常適用于以下場景:
首先需要使用 npm 安裝 Lit:
npm i lit
然后導入 JavaScript 或 TypeScript 文件:
import { LitElement, html } from "lit";
import { customElement, property } from "lit/decorators.js";
當然,Lit 還可以作為預構建的單文件包提供,從而提高開發工作流程的靈活性:例如,如果開發者更愿意下載單個文件而不是使用 npm 和構建工具。
這些包是沒有依賴關系的標準 JavaScript 模塊 , 任何現代瀏覽器都能夠從 <script type="module"> 中導入并運行這些代碼,如下所示:
import {
LitElement,
html,
} from "https://cdn.jsdelivr.net/gh/lit/dist@2/core/lit-core.min.js";
下面使用 Lit 開發了一個 Web Component:
import {LitElement, html, css} from 'lit';
import {customElement, property, state} from 'lit/decorators.js';
import {play, pause, replay} from './icons.js';
@customElement("my-timer")
// @customElement是類裝飾器工廠將裝飾類定義為自定義元素,即 my-timer
export class MyTimer extends LitElement {
static styles=css`/* playground-fold */
:host {
display: inline-block;
min-width: 4em;
text-align: center;
padding: 0.2em;
margin: 0.2em 0.1em;
}
footer {
user-select: none;
font-size: 0.6em;
}
@property() duration=60;
@state() private end: number | null=null;
@state() private remaining=0;
render() {
const {remaining, running}=this;
const min=Math.floor(remaining / 60000);
const sec=pad(min, Math.floor(remaining / 1000 % 60));
const hun=pad(true, Math.floor(remaining % 1000 / 10));
return html`
${min ? `${min}:${sec}` : `${sec}.${hun}`}
<footer>
${remaining===0 ? '' : running ?
html`<span @click=${this.pause}>${pause}</span>` :
html`<span @click=${this.start}>${play}</span>`}
<span @click=${this.reset}>${replay}</span>
</footer>
`;
}
start() {
this.end=Date.now() + this.remaining;
this.tick();
}
pause() {
this.end=null;
}
reset() {
const running=this.running;
this.remaining=this.duration * 1000;
this.end=running ? Date.now() + this.remaining : null;
}
tick() {
if (this.running) {
this.remaining=Math.max(0, this.end! - Date.now());
requestAnimationFrame(()=> this.tick());
}
}
get running() {
return this.end && this.remaining;
}
connectedCallback() {
super.connectedCallback();
this.reset();
}
}
上面代碼有幾點值得說明:
聲明了 my-timer 這個 Web Component 后,接著就可以在 HTML 中引入這個 my-timer 來直接使用:
<!doctype html>
<head>
<link rel="preconnect" href="https://fonts.gstatic.com">
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:ital,wght@1,800&display=swap" rel="stylesheet">
<script type="module" src="./my-timer.js"></script>
<style>
body {
font-family: 'JetBrains Mono', monospace;
font-size: 36px;
}
</style>
</head>
<body>
<my-timer duration="7"></my-timer>
<my-timer duration="60"></my-timer>
<my-timer duration="300"></my-timer>
</body>
當然,Lit 還包括:指令(Directives)、Shadow DOM、生命周期(Lifecycle)、上下文(Context)、Lit 服務端渲染(Lit SSR)、前端框架集成等高級用法,這些可以在文末的參考資料中直接使用,本文不再過多展開。
本文主要和大家介紹 Lit ,即一個簡單的庫,用于構建快速、輕量級的 Web Component。相信通過本文的閱讀,大家對 Lit 會有一個初步的了解。
因為篇幅有限,關于 Lit 的更多用法和特性文章并沒有過多展開,如果有興趣,可以在我的主頁繼續閱讀,同時文末的參考資料提供了大量優秀文檔以供學習。最后,歡迎大家點贊、評論、轉發、收藏,您的支持是我不斷創作的動力。
https://github.com/lit/lit
https://lit.dev/tutorials/intro-to-lit/
https://lit.dev/docs/
https://www.npmjs.com/package/lit
https://lit.dev/docs/frameworks/react/
https://coderpad.io/blog/development/web-components-101-framework-comparison/
https://medium.com/front-end-weekly/web-components-lwc-stencil-and-lit-by-numbers-b158efcf82f7
*請認真填寫需求信息,我們會在24小時內與您取得聯系。