整合营销服务商

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

免费咨询热线:

后浪搞的在线版 Windows 12「GitHub

后浪搞的在线版 Windows 12「GitHub 热点速览」

周比较火的莫过于 3 位初中生开源的 Windows 12 网页版,虽然项目完成度不如在线版的 Windows 11,但是不妨一看。除了后生可畏的 win12 之外,开源不到一周的 open-interpreter 表现也很抢眼,一个在终端就能使唤的 AI 助手获得了 15k+ star。

还有深度开源的 deepin-unioncode IDE 表现也不俗,还有不能错过的静态分析工具 biome 和 React 编辑器 puck 都可以玩玩看。

选项标准:新发布 | 实用 | 有趣,根据项目 release 时间分类,发布时间不超过 14 day 的项目会标注 New,无该标志则说明项目 release 超过半月。由于本文篇幅有限,还有部分项目未能在本文展示,望周知

1. 本周特推

1.1 在你的计算机里跑模型:open-interpreter

主语言:Python

New 这是一个在你计算机里运行语言模型的项目,支持 Python、JavaScript、Shell 等等。安装后,通过在终端中运行 $ interpreter,就可以通过类似 ChatGPT 的界面与 open-interpreter 聊天。比如,像是 demo 里,让它将系统主题变暗黑,btw,这个项目开源没到一周,便获得了 15k+ star,可见其受欢迎程度。

GitHub 地址→github.com/KillianLucas/open-interpreter

1.2 Windows 在线版:win12

主语言:HTML、JavaScript

这是 3 个初中生做的 Windows 12 在线体验版,在线就能体验一把 Windows 12。如果你还在用 Windows 11,不妨试试这个在线版的 12,再考虑是否升级系统。

GitHub 地址→github.com/tjy-gitnub/win12

2. GitHub Trending 周榜

2.1 React 编辑器:puck

本周 star 增长数 1,150+,主语言:TypeScript

可用来写 React 的自托管、拖拽编辑器,特性:

  • 拖拽:对现有 React 组件进行可视化编辑;
  • 集成:从第三方 CMS 里加载内容;
  • 内置编辑:可方便地直接通过 puck 编写内容;
  • 支持自托管,与现有应用集成;

GitHub 地址→github.com/measuredco/puck

2.2 深度 IDE:deepin-unioncode

本周 star 增长数:450+,主语言:C++

深度公司开源的深度集成开发环境,具有多语言、跨平台等特性。

GitHub 地址→github.com/linuxdeepin/deepin-unioncode

2.3 短链接服务:dub

本周 star 增长数:1,050+,主语言:TypeScript

支持自定义域名的短链接缩短服务,dub 还自带分析功能,你可以统计到链接点击情况、点击区域分布等等信息。此外,它还支持生成短链接相对应的二维码。

GitHub 地址→github.com/steven-tey/dub

2.4 Web 开发工具:biome

本周 star 增长数:750+,主语言:Rust

New 不到一秒,它就能格式化并检查你的代码。除了静态代码分析之外,biome 有一流的 IDE,其复杂的解析器可以高保真地展示源文本,并提供一流的错误恢复功能。而 biome 的设计目标是为了最终取代 Babel、ESLint、Webpack、Prettier、Jest 等工具。

GitHub 地址→github.com/biomejs/biome

2.5 GPT 型全能 App:aidea

本周 star 增长数:800+,主语言:Dart

New 一款集成了主流大语言模型以及绘图模型的 APP, 采用 Flutter 开发,代码完全开源,支持以下功能:

  • 支持 GPT-3.5/4 问答聊天
  • 支持国产模型:通义千问,文心一言、讯飞星火
  • 支持文生图、图生图、超分辨率、黑白图片上色等功能,集成 Stable Diffusion 模型,支持 SDXL 1.0

GitHub 地址→github.com/mylxsw/aidea

3. HelloGitHub 热评

在这个章节,我们将会分享下本周 HelloGitHub 网站上的热评项目,HG 开源项目评价体系刚上线不久,期待你的评价。

3.1 macOS 系统固件:Mist

主语言:Swift

这款工具可以列出所有可供下载的 macOS 固件/安装程序的信息,包括名称、版本号、发布日期和大小。

HG 评价地址→hellogithub.com/repository/00c31d3483b7498d8961c05b7ec8cdb9

3.2 Go 的 XML 库:etree

主语言:Go

虽然 Go 语言内置了处理 XML 的库,但在使用时必须按照嵌套层级定义结构体非常繁琐。这个项目的设计灵感来源于 Python 语言的 ElementTree 库,可以在无需定义结构体的情况下灵活的读取、生成 XML 文档。

HG 评价地址→hellogithub.com/repository/89689a3f8df5449ea9a7fe1cafc13c10

- END -

译]Vue 最黑暗的一天

JavaScript 今天

原文:Vue's Darkest Day 作者:Daniel Elkington

译者注:原文写于2019年6月21日

今天,我惊讶的发现,往常积极友好的 VueJS 社区陷入了一场激烈的战争。两周前,Vue 的创建者尤雨溪发布了一个请求意见稿(RFC),用于在即将发布的 Vue 3.0 中使用基于函数的方式编写 Vue 组件。今天,一个 Reddit 上批评性的帖子和 Hacker News 上一些类似的批评性的评论,引起大批开发者涌向原本的 RFC 来表达他们的愤怒,其中一些有点侮辱性。在很多地方都有人声称:

  • 所有 Vue 代码都必须以全新的方式重写,因为现有的语法正在被移除,并且被其他东西取代;
  • 人们花在学习 Vue 上的所有时间都被浪费了,因为一切都会改变;
  • 新语法比旧的更糟糕,因为它没有强制的结构,并且会导致意大利面条式代码;
  • Vue 核心团队在没有任何咨询的情况下突然施行一个巨大的破坏性的变化;
  • Vue 要变成 React 了!
  • 不,Vue 要变成 AngularJS/Angular 了!
  • 所有 HTML 都要写在一个超长的字符串里!


看过 Reddit 上成堆的负面评论,你可能会在 RFC 页面上惊讶的发现尤雨溪的 RFC 收到的正面的表情回应的比例比负面的高得多,而且许多早期评论都是相当正面的。实际上,第一条评论就充满了溢美之词。

我就是第一个写评论的人。我碰巧收到新 RFC 的通知,马上读了一下,发现这正是我想从 Vue 3.0 得到的,而且它会给我极大的帮助,于是我在 RFC 发布 15 分钟后留下了第一条评论来表达我的谢意。我希望在这里进一步说明为什么我觉得新提案是一个如此好的主意,但首先,要回应一些批评。

我怀疑很多人在阅读了 Hacker News 或 Reddit 上有着很多误导性评论的帖子之后有点激动,他们在没有阅读原始提案的情况下就表达了自己的愤怒。尤雨溪已经更新了这个提案,通过问答的方式回应了人们的很多问题,总的来说:

  • 如果你不想重写任何代码,那么你就不需要重写——新语法是附加的,而且只要旧语法仍然被广泛使用,它在 Vue 3.0 中依然有效。就算它最终被从核心代码中移除了,也可以很容易地通过插件来使旧语法 100% 有效。
  • 学习 Vue 的时间并没有浪费——新组件语法使用的概念与你之前花时间学习的一样,其他概念,例如单文件组件、模板、scoped style 的功用完全一样。
  • 没有经过咨询,就不会改变—— RFC 就是在 咨询。新语法离发布还有很长一段路要走。
  • 不,HTML 代码不需要被写进一个超长字符串。


一个更主观的观点是:新语法不如旧语法,并且会导致结构化程度较低的代码。我希望通过一个简单的例子来说明为什么我在看到 RFC 时如此兴奋,以及为什么我觉得它更优秀,将会导致结构化 更好 的代码。

考虑一下下面的有趣组件,用户可以输入宠物的详细信息。请注意:

  • 当他们输入完宠物的名字时会显示一条信息;
  • 另一条信息会在他们选择宠物的大小后显示。





你可以在这里尝试组件的demo,也可以在这里查看使用 Vue 2.x 编写的代码(在 components/Vue2.vue)

考虑一下这个组件的 JavaScript:

export
 
default
 
{
 data
()
 
{
 
return
 
{
 petName
:
 
""
,
 petNameTouched
:
 
false
,
 petSize
:
 
""
,
 petSizeTouched
:
 
false
 
};
 
},
 computed
:
 
{
 petNameComment
:
 
function
()
 
{
 
if
 
(
this
.
petNameTouched
)
 
{
 
return
 
"Hello "
 
+
 
this
.
petName
;
 
}
 
return
 
null
;
 
},
 petSizeComment
:
 
function
()
 
{
 
if
 
(
this
.
petSizeTouched
)
 
{
 
switch
 
(
this
.
petSize
)
 
{
 
case
 
"Small"
:
 
return
 
"I can barely see your pet!"
;
 
case
 
"Medium"
:
 
return
 
"Your pet is pretty average."
;
 
case
 
"Large"
:
 
return
 
"Wow, your pet is huge!"
;
 
default
:
 
return
 
null
;
 
}
 
}
 
return
 
null
;
 
}
 
},
 methods
:
 
{
 onPetNameBlur
:
 
function
()
 
{
 
this
.
petNameTouched=true
;
 
},
 onPetSizeChange
:
 
function
()
 
{
 
this
.
petSizeTouched=true
;
 
}
 
}
};

实质上,我们有一些数据、从这些数据计算出的属性、以及 操作这些数据的方法。注意,在 Vue 2.x 中我们 没有办法把相关的东西放在一起。我们不能把 petName 数据声明放在 petNameComment 计算属性或者 onPetNameBlur 方法旁边,因为在 Vue 2.x 中,这些选项是按照类型组织的。

当然,对于像这样的小例子来说,这不太重要。但是想象一个更大的例子,它有很多功能,需要 data、 computed、 methods、甚至是一两个 watcher。目前还 没有好方法 来把相关的东西放一起!有人可能会使用诸如 Mixin 或高阶组件之类的办法,但是它们都有问题——很难辨别一个属性来自哪里,还有命名空间的冲突。(是的,在这种情况下,拆分为多个组件是可能的,但是这个类似的例子就不行)

新提案不是按照选项的类型来组织组件,而是允许我们按照实际功能来组织组件。这类似于你在电脑上整理个人文件的方式——你通常没有“表格”文件夹和“Word 文档”文件夹,相反,你可能有一个”工作“文件夹和一个”假期计划“文件夹。想象一下使用提案里的语法来编写组件(尽我所能,如果你看到了什么 bug 请告诉我):

import
 
{
 state
,
 computed 
}
 
from
 
"vue"
;
export
 
default
 
{
 setup
()
 
{
 
const
 petNameState=state
({
 name
:
 
""
,
 touched
:
 
false
 
});
 
const
 petNameComment=computed
(()=>
 
{
 
if
 
(
petNameState
.
touched
)
 
{
 
return
 
"Hello "
 
+
 petNameState
.
name
;
 
}
 
return
 
null
;
 
});
 
const
 onPetNameBlur=()=>
 
{
 petNameState
.
touched=true
;
 
};
 
const
 petSizeState=state
({
 size
:
 
""
,
 touched
:
 
false
 
});
 
const
 petSizeComment=computed
(()=>
 
{
 
if
 
(
petSizeState
.
touched
)
 
{
 
switch
 
(
this
.
petSize
)
 
{
 
case
 
"Small"
:
 
return
 
"I can barely see your pet!"
;
 
case
 
"Medium"
:
 
return
 
"Your pet is pretty average."
;
 
case
 
"Large"
:
 
return
 
"Wow, your pet is huge!"
;
 
default
:
 
return
 
null
;
 
}
 
}
 
return
 
null
;
 
});
 
const
 onPetSizeChange=()=>
 
{
 petSizeState
.
touched=true
;
 
};
 
return
 
{
 petName
:
 petNameState
.
name
,
 petNameComment
,
 onPetNameBlur
,
 petSize
:
 petSizeState
.
size
,
 petSizeComment
,
 onPetSizeChange
 
};
 
}
};

注意:

  • 很容易把相关的东西放到一起;
  • 通过查看 setup 函数的返回值,我们可以很容易地知道模板中可以获取什么变量;
  • 我们甚至可以避免暴露模板不需要获取的内部状态(touched)。


除此之外,新语法可以有完整的 Typescript 支持,这在 Vue 2.x 基于对象的语法中很难实现。而且我们可以很轻易地把可重用的逻辑提取为可重用的函数。例如:

import
 
{
 state
,
 computed 
}
 
from
 
"vue"
;
function
 usePetName
()
 
{
 
const
 petNameState=state
({
 name
:
 
""
,
 touched
:
 
false
 
});
 
const
 petNameComment=computed
(()=>
 
{
 
if
 
(
petNameState
.
touched
)
 
{
 
return
 
"Hello "
 
+
 petNameState
.
name
;
 
}
 
return
 
null
;
 
});
 
const
 onPetNameBlur=()=>
 
{
 petNameState
.
touched=true
;
 
};
 
return
 
{
 petName
:
 petNameState
.
name
,
 petNameComment
,
 onPetNameBlur
 
};
}
function
 usePetSize
()
 
{
 
const
 petSizeState=state
({
 size
:
 
""
,
 touched
:
 
false
 
});
 
const
 petSizeComment=computed
(()=>
 
{
 
if
 
(
petSizeState
.
touched
)
 
{
 
switch
 
(
this
.
petSize
)
 
{
 
case
 
"Small"
:
 
return
 
"I can barely see your pet!"
;
 
case
 
"Medium"
:
 
return
 
"Your pet is pretty average."
;
 
case
 
"Large"
:
 
return
 
"Wow, your pet is huge!"
;
 
default
:
 
return
 
null
;
 
}
 
}
 
return
 
null
;
 
});
 
const
 onPetSizeChange=()=>
 
{
 petSizeState
.
touched=true
;
 
};
 
return
 
{
 petSize
:
 petSizeState
.
size
,
 petSizeComment
,
 onPetSizeChange
 
};
}
export
 
default
 
{
 setup
()
 
{
 
const
 
{
 petName
,
 petNameComment
,
 onPetNameBlur 
}=usePetName
();
 
const
 
{
 petSize
,
 petSizeComment
,
 onPetSizeChange 
}=usePetSize
();
 
return
 
{
 petName
,
 petNameComment
,
 onPetNameBlur
,
 petSize
,
 petSizeComment
,
 onPetSizeChange
 
};
 
}
};

在 Vue 2.x 中,我经常发现自己写了个“怪兽组件”,它很难分解成更小的部分——它不能分解成其他的组件,因为很多事务基于少量状态。然而,使用提案中的语法,很容易看出大型组件的逻辑可以被分解为更小的可重用部分,在必要时移动到独立的文件里,留给你小的、易于理解的函数和组件。

这是目前为止 Vue 最黑暗的一天吗?看起来是的。一直团结追随这个项目方向的社区已经分裂了。但我希望人们能够重新审视这个提案,它没有破坏任何东西,只要他们想,仍然可以按照选项的类型来组织它们,但是可以做到更多——更清晰的代码、更简洁的代码、更有意思的库、还有完善的 Typescript 支持。

最后,在使用开源软件时,最好记住,全靠维护者投入的大量精力,你才可以免费使用它。今天的一些过分批评是他们不应该承受的。好在这些无礼的批评只是少数(尽管数量相当多),大多数人能以更礼貌的方式表达自己。

2019年6月23日更新:

我很快就写好了原文,并没有期望它能得到这样的关注。然后我意识到这个代码示例对于我想要表达的观点来说过于复杂,所以我把它简化了很多。原本的代码示例在这里。

作者:李润泽

TML称为超文本标记语言,是一种标识性的语言。在前端开发中离不开HTML,支持不同数据格式的文件镶入。前端工程师在面试过程中涉及到一些基础知识,常见的前端HTML面试题有哪些呢?本文,千锋武汉Web前端培训小编分享12道经典的HTML面试题给大家!

1、<image>标签上title属性与alt属性的区别是什么?

alt属性是为了给那些不能看到你文档中图像的浏览者提供文字说明的。且长度必须少于100个英文字符或者用户必须保证替换文字尽可能的短。

这包括那些使用本来就不支持图像显示或者图像显示被关闭的浏览器的用户,视觉障碍的用户和使用屏幕阅读器的用户等。

title属性为设置该属性的元素提供建议性的信息。使用title属性提供非本质的额外信息。参考《alt和title属性的区别及应用》

2、分别写出以下几个HTML标签:文字加粗、下标、居中、字体

加粗:<b>、<strong>

下标:<sub>

居中:<center>

字体:<font>、<basefont>、参考《HTML标签列表》

3、请写出至少5个html5新增的标签,并说明其语义和应用场景

section:定义文档中的一个章节

nav:定义只包含导航链接的章节

header:定义页面或章节的头部。它经常包含 logo、页面标题和导航性的目录。

footer:定义页面或章节的尾部。它经常包含版权信息、法律信息链接和反馈建议用的地址。

aside:定义和页面内容关联度较低的内容——如果被删除,剩下的内容仍然很合理。

参考《HTML5 标签列表》

4、请说说你对标签语义化的理解?

a. 去掉或者丢失样式的时候能够让页面呈现出清晰的结构

b. 有利于SEO:和搜索引擎建立良好沟通,有助于爬虫抓取更多的有效信息:爬虫依赖于标签来确定上下文和各个关键字的权重;

c. 方便其他设备解析(如屏幕阅读器、盲人阅读器、移动设备)以意义的方式来渲染网页;

d. 便于团队开发和维护,语义化更具可读性,遵循W3C标准的团队都遵循这个标准,可以减少差异化。

5、Doctype作用? 严格模式与混杂模式如何区分?它们有何意义?

声明位于文档中的最前面,处于 标签之前。告知浏览器以何种模式来渲染文档。

严格模式的排版和 JS 运作模式是,以该浏览器支持的最高标准运行。

在混杂模式中,页面以宽松的向后兼容的方式显示。模拟老式浏览器的行为以防止站点无法工作。

DOCTYPE不存在或格式不正确会导致文档以混杂模式呈现。

6、你知道多少种Doctype文档类型?

标签可声明三种 DTD 类型,分别表示严格版本、过渡版本以及基于框架的 HTML 文档。

HTML 4.01 规定了三种文档类型:Strict、Transitional 以及 Frameset。

XHTML 1.0 规定了三种 XML 文档类型:Strict、Transitional 以及 Frameset。

Standards (标准)模式(也就是严格呈现模式)用于呈现遵循最新标准的网页,

Quirks(包容)模式(也就是松散呈现模式或者兼容模式)用于呈现为传统浏览器而设计的网页。

7、HTML与XHTML——二者有什么区别

a. XHTML 元素必须被正确地嵌套。

b. XHTML 元素必须被关闭。

c. 标签名必须用小写字母。

d. XHTML 文档必须拥有根元素。

参考《XHTML 与 HTML 之间的差异》

8、html5有哪些新特性、移除了那些元素?

a. HTML5 现在已经不是 SGML 的子集,主要是关于图像,位置,存储,多任务等功能的增加。

b. 拖拽释放(Drag and drop) API

c. 语义化更好的内容标签(header,nav,footer,aside,article,section)

d. 音频、视频API(audio,video)

e. 画布(Canvas) API

f. 地理(Geolocation) API

g. 本地离线存储 localStorage 长期存储数据,浏览器关闭后数据不丢失

h. sessionStorage 的数据在页面会话结束时会被清除

i. 表单控件,calendar、date、time、email、url、search

j. 新的技术webworker, websocket等

移除的元素:

a. 纯表现的元素:basefont,big,center, s,strike,tt,u;

b. 对可用性产生负面影响的元素:frame,frameset,noframes;

9、iframe的优缺点?

优点:

a. 解决加载缓慢的第三方内容如图标和广告等的加载问题

b. iframe无刷新文件上传

c. iframe跨域通信

缺点:

a. iframe会阻塞主页面的Onload事件

b. 无法被一些搜索引擎索引到

c. 页面会增加服务器的http请求

d. 会产生很多页面,不容易管理。

参考《iframe的一些记录》

10、Quirks模式是什么?它和Standards模式有什么区别?

在写程序时我们也会经常遇到这样的问题,如何保证原来的接口不变,又提供更强大的功能,尤其是新功能不兼容旧功能时。IE6以前的页面大家都不会去写DTD,所以IE6就假定 如果写了DTD,就意味着这个页面将采用对CSS支持更好的布局,而如果没有,则采用兼容之前的布局方式。这就是Quirks模式(怪癖模式,诡异模式,怪异模式)。

区别:总体会有布局、样式解析和脚本执行三个方面的区别。

a. 盒模型:在W3C标准中,如果设置一个元素的宽度和高度,指的是元素内容的宽度和高度,而在Quirks 模式下,IE的宽度和高度还包含了padding和border。

b. 设置行内元素的高宽:在Standards模式下,给等行内元素设置wdith和height都不会生效,而在quirks模式下,则会生效。

c. 设置百分比的高度:在standards模式下,一个元素的高度是由其包含的内容来决定的,如果父元素没有设置百分比的高度,子元素设置一个百分比的高度是无效的用

d. 设置水平居中:使用margin:0 auto在standards模式下可以使元素水平居中,但在quirks模式下却会失效。

11、请阐述table的缺点

a. 太深的嵌套,比如table>tr>td>h3,会导致搜索引擎读取困难,而且,最直接的损失就是大大增加了冗余代码量。

b. 灵活性差,比如要将tr设置border等属性,是不行的,得通过td

c. 代码臃肿,当在table中套用table的时候,阅读代码会显得异常混乱

d. 混乱的colspan与rowspan,用来布局时,频繁使用他们会造成整个文档顺序混乱。

e. 不够语义

参考《为什么说table表格布局不好?》

12、简述一下src与href的区别

src用于替换当前元素;href用于在当前文档和引用资源之间确立联系。

src是source的缩写,指向外部资源的位置,指向的内容将会嵌入到文档中当前标签所在位置

href是Hypertext Reference的缩写,指向网络资源所在位置,建立和当前元素(锚点)或当前文档(链接)之间的链接

以上千锋武汉Web前端培训小编仅介绍了部分HTML面试题及答案。如果想要在众多竞争者中脱颖而出,除了专业技能还需要掌握一些求职面试的技巧,在面试过程中争取更多的主动权。了解更多Web前端工程师求职面试技巧,你可以关注“武汉千锋”微信公众号,定期发布技术热点文章和求职指南。你也可以来千锋武汉Web前端培训班免费试听两周,亲身感受教学效果,满意后进行系统深入的学习进阶!

千锋武汉Web前端培训课程结合时下流行技术,以实战项目驱动教学,除了培养学员的开发技术,覆盖热门大数据可视化内容,深度贯穿前端后端开发,紧贴主流企业一线需求。这里有专业老师带你,最多半年的时间让你完美蜕变。进名企、拿高薪不再是问题,命运掌握在自己的手里,想要什么样的人生就看你自己的选择了!