文转自: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,这个后面猪哥也会为大家讲解。
希望大家永远记住:学任何一门语言,都不要忘记去看看官方文档。也许官方文档不是最好的入门教程,但绝对是最新、最全的教学文档!
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小时内与您取得联系。