整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

2020 年你应该知道的 8 种前端 JavaScr

2020 年你应该知道的 8 种前端 JavaScript 趋势和工具


文转自: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中我们又如何发起网络请求的呢?答案当然是库,具体哪些库?猪哥给大家列一下:

  • Python2: httplib、httplib2、urllib、urllib2、urllib3、requests
  • Python3: httplib2、urllib、urllib3、requests

Python网络请求库有点多,而且还看见网上还都有用过的,那他们之间有何关系?又该如何选择?

  • httplib/2:这是一个Python内置http库,但是它是偏于底层的库,一般不直接用。而httplib2是一个基于httplib的第三方库,比httplib实现更完整,支持缓存、压缩等功能。一般这两个库都用不到,如果需要自己 封装网络请求可能会需要用到。
  • urllib/urllib2/urllib3:urlliib是一个基于httplib的上层库,而urllib2和urllib3都是第三方库,urllib2相对于urllib增加一些高级功能,如:HTTP身份验证或Cookie等,在Python3中将urllib2合并到了urllib中。urllib3提供线程安全连接池和文件post等支持,与urllib及urllib2的关系不大。
  • requests:requests库是一个基于urllib/3的第三方网络库,它的特点是功能强大,API优雅。由上图我们可以看到,对于http客户端python官方文档也推荐我们使用requests库,实际工作中requests库也是使用的比较多的库。

综上所述,我们选择选择requests库作为我们爬虫入门的起点。另外以上的这些库都是同步网络库,如果需要高并发请求的话可以使用异步网络库:aiohttp,这个后面猪哥也会为大家讲解。

二、requests介绍

希望大家永远记住:学任何一门语言,都不要忘记去看看官方文档。也许官方文档不是最好的入门教程,但绝对是最新、最全的教学文档!

1.首页

requests的官方文档(目前已支持中文)

从首页中让HTTP服务人类这几个字中我们便能看出,requests核心宗旨便是让用户使用方便,间接表达了他们设计优雅的理念。

注:PEP 20便是鼎鼎大名的Python之禅。

警告:非专业使用其他 HTTP 库会导致危险的副作用,包括:安全缺陷症、冗余代码症、重新发明轮子症、啃文档症、抑郁、头疼、甚至死亡。

2.功能特性

都说requests功能强大,那我们来看看requests到底有哪些功能特性吧:

  • Keep-Alive & 连接池
  • 国际化域名和 URL
  • 带持久 Cookie 的会话
  • 浏览器式的 SSL 认证
  • 自动内容解码
  • 基本/摘要式的身份认证
  • 优雅的 key/value Cookie
  • 自动解压
  • Unicode 响应体
  • HTTP(S) 代理支持
  • 文件分块上传
  • 流下载
  • 连接超时
  • 分块请求
  • 支持 .netrc

requests 完全满足今日 web 的需求。Requests 支持 Python 2.6—2.7以及3.3—3.7,而且能在 PyPy 下完美运行

三、安装requests

pip install requests

如果是pip3则使用

pip3 install requests

如果你使用anaconda则可以

conda install requests

如果你不想用命令行,可在pycharm中这样下载库

四、爬虫流程

下图是猪哥之前工作总结的一个项目开发流程,算是比较详细,在开发一个大型的项目真的需要这么详细,不然项目上线出故障或者修改需求都无法做项目复盘,到时候程序员就有可能背锅祭天。。。

言归正传,给大家看项目的开发流程是想引出爬虫爬取数据的流程:

  1. 确定需要爬取的网页
  2. 浏览器检查数据来源(静态网页or动态加载)
  3. 寻找加载数据url的参数规律(如分页)
  4. 代码模拟请求爬取数据

起点中文网创建于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。话不多说,直接进入正题!

1.什么是 Lit

Lit 是一个简单的库,用于构建快速、轻量级的 Web Component。 Lit 的核心是一个消除样板的组件基类,它提供反应式状态、作用域样式和一个微小、快速且富有表现力的声明性模板系统。

Lit 具有以下优势:

  • 简单/去样板化:Lit 建立在 Web Component 标准之上,添加了反应性、声明性模板和一些优秀功能,以减少样板文件并使工作更轻松。 每个 Lit 功能都经过精心设计,并考虑到 Web 平台的发展。
  • 快速地/体积小/即时更新:Lit 的体积约为 5 KB(minified and compressed),有助于保持较小的包体积并缩短加载时间。而且渲染速度非常快,因为 Lit 在更新时只涉及 UI 的动态部分 ,无需重建虚拟树并将其与 DOM 进行比较。
  • 可互操作/面向未来:每个 Lit 组件都是原生 Web Component,具有超强的互操作性。 Web Component 可以在任何使用 HTML 的地方工作,可以使用任何框架,也可以不使用框架。 这使得 Lit 成为构建可共享组件、设计系统或可维护、面向未来的网站和应用程序的理想选择。

除了以上特点外,Lit 的优势还包括:

  • 标准自定义元素:Lit 组件是标准的自定义元素,因此浏览器将它们完全视为内置元素。 在手写的 HTML 或框架代码中使用它们,从 CMS 或静态站点构建器输出它们,甚至在 JavaScript 中创建实例
  • 支持范围样式(Scoped styles):Lit 默认使用 Shadow DOM 来确定样式的范围,从而使得 CSS 选择器保持简单,并确保组件的样式不会影响页面上的任何其他样式,也不受其影响。
  • 支持反应性:支持声明响应式属性来对组件的 API 和内部状态进行建模。 每当反应性属性(或相应的 HTML 属性)发生变化时,Lit 组件就会有效地重新渲染。
  • 声明性模板:Lit 模板基于标记的模板文字,简单、富有表现力且快速,具有 HTML 标记和内联的原生 JavaScript 表达式。 无需学习自定义语法,更重要的是无需编译。

目前 Lit 在 Github 上通过 BSD-3-Clause 协议开源,有超过 15.1k 的 star、0.8k 的 fork、38.1k 的项目依赖量,代码贡献者 160+,npm 周平均下载量 845k,是一个妥妥的前端优质开源项目,值得长期关注。

2.Lit 的使用场景

开发者可以使用 Lit 构建几乎任何类型的 Web UI!

每个 Lit 组件都是标准的 Web 组件。 Web 组件具有互操作性的超强能力,本身受浏览器的支持,可以在任何 HTML 环境中使用,可以使用任何框架,也可以不依赖框架。

这使得 Lit 成为开发可共享组件或设计系统的理想选择。 Lit 组件可以跨多个应用程序和站点使用,即使这些应用程序和站点构建在各种前端堆栈上。 使用 Lit 组件的站点开发人员不需要编写甚至不需要查看任何 Lit 代码,可以像使用内置 HTML 元素一样使用这些组件。

Lit 还非常适合用于逐步增强基本 HTML 网站。 浏览器将识别标记中的 Lit 组件并自动初始化, 无论站点是手工制作的、通过 CMS 管理的、使用服务器端框架构建的,还是由 Jekyll 或 Eleventy 等工具生成的。

当然,开发者也可以使用 Lit 组件构建高度交互、功能丰富的应用程序,就像使用 React 或 Vue 等框架一样。 Lit 的功能和开发人员体验与这些流行的替代方案相当,但 Lit 通过采用浏览器的本机组件模型最大限度地减少锁定、最大限度地提高灵活性并提高可维护性。

总结起来,Lit 非常适用于以下场景:

  • 共享组件:支持可放入任何站点、构建在任何堆栈上的交互式内容。由于浏览器本身就支持 Web Component,因此 Web Component 是完美的解决方案,而且 Lit 使它们易于构建。
  • 设计系统:设计系统可帮助创造始终如一的卓越品牌体验,而 Lit 能够有效解决跨框前端架、跨团队的诸多问题。
  • 网站和应用程序:使用 Lit 组件逐步增强静态站点或构建整个应用程序。 通过采用 Web Component,Lit 最大限度减少了锁定并提高了可维护性。

3.开始使用 Lit

3.1 安装 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";

3.2 使用 Lit 开发一个 Web Component

下面使用 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();
  }
}

上面代码有几点值得说明:

  • Lit 的主要功能是 LitElement 基类,它是原生 HTMLElement 的便捷且多功能的扩展, 主要功能是:管理元素 properties 和 attribute 并渲染 lit-html 模板的基本元素类。
  • @property()是一个属性装饰器,它创建相应属性值的反应性属性。 当设置装饰属性时,元素将更新并渲染。 也可以选择提供 PropertyDeclaration 来配置属性功能。
  • @state() 声明一个私有或受保护的响应式属性,代表组件的公共 API 和/或内部状态,该属性在更改时会触发元素的更新,它不会从相应的属性中反映出来。
  • 默认情况下,样式是有范围(scope)的,使 CSS 选择器保持简单,并确保组件的样式不会污染(或被污染)周围的上下文。
  • Lit 富有表现力的声明性模板(利用 JavaScript 标记模板文字)可以轻松描述组件的渲染方式。
  • Lit 在普通 JavaScript 表现良好,开发者可以通过使用装饰器和类型声明来使用 TypeScript 以获得更好的人体工程学效果。

声明了 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)、前端框架集成等高级用法,这些可以在文末的参考资料中直接使用,本文不再过多展开。

4.本文总结

本文主要和大家介绍 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