有哪些让你为之心动的时刻

【npm】browser-es-module-loader

本文将向您展示如何在浏览器中使用 ES 模块。

直到最近,JavaScript 还没有模块的概念。 无法直接引用一个 JavaScript 文件或将其包含在另一个 JavaScript 文件中。 随着应用程序的规模和复杂性的增长,这使得为浏览器编写 JavaScript 变得棘手。

一种常见的解决方案是使用<script>标记在网页中加载任意脚本。 但是,这带来了自己的问题。 例如,每个脚本都会启动一个阻止渲染的 HTTP 请求,这可能会使重载 JS 的页面显得迟钝且缓慢。 依赖管理也变得复杂,因为加载顺序很重要。

ES6(ES2015)通过引入单个本机模块标准来解决这种情况。 (您可以在此处阅读有关 ES6 模块的更多信息 。)但是,由于浏览器最初对 ES6 模块的支持不佳,人们开始使用模块加载器将依赖项捆绑到单个 ES5 跨浏览器兼容文件中。 此过程介绍了自己的问题和复杂程度。

但是,好消息即将到来。 浏览器支持变得越来越好,因此让我们看一下如何在当今的浏览器中使用 ES6 模块。

当前的 ES 模块格局

Safari,Chrome,Firefox 和 Edge 均支持 ES6 模块导入语法。 这是他们的样子。

<script type="module">
  import { tag } from './html.js'
 
  const h1 = tag('h1', '👋 Hello Modules!')
  document.body.appendChild(h1)
</script>
// html.js
export function tag (tag, text) {
  const el = document.createElement(tag)
  el.textContent = text
 
  return el
}

或作为外部脚本:

<script type="module" src="app.js"></script>


// app.js
import { tag } from './html.js'
 
const h1 = tag('h1', '👋 Hello Modules!')
document.body.appendChild(h1)

只需将type="module"添加到脚本标签中,浏览器就会将它们加载为 ES 模块。 浏览器将遵循所有导入路径,仅下载和执行每个模块一次。

1

较旧的浏览器不会执行具有未知 “类型” 的脚本,但是您可以使用nomodule属性定义后备脚本:

<script type="module" src="module.js"></script>
<script nomodule src="fallback.js"></script>

需求

您将需要一台服务器,以便能够通过导入进行获取,因为它不适用于file://协议。 您可以使用npx serve在当前目录中启动服务器以进行本地测试。

如果要在其他域上加载 ES 模块,则需要启用 CORS。

如果您足够大胆地尝试在今天的产品中进行尝试,则仍然需要为较旧的浏览器创建单独的捆绑软件。 在遵循规范的浏览器 – es-module-loader 中有一个 polyfill。 但是,根本不建议将其用于生产。

<script nomodule src="https://unpkg.com/browser-es-module-loader/dist/babel-browser-build.js"></script>
<script nomodule src="https://unpkg.com/browser-es-module-loader"></script>
<script type="module" src="./app.js"></script>

性能

暂时不要扔掉 Babel 和 Webpack 等构建工具,因为浏览器仍在实现优化获取的方法。 尽管如此,将来使用 ES 模块_仍会_有性能_缺陷_和_收获_ 。

为什么我们是捆绑的

今天,我们捆绑了 JavaScript 以减少发出的 HTTP 请求的数量,因为_网络_通常是加载网页中最慢的部分。 今天,这仍然是一个非常有效的担忧,但未来是光明的:具有 HTTP2 的 ES 模块能够通过服务器推送和实现预加载的浏览器流式传输多个资产。

预装

link rel =“modulepreload” 即将发送到您附近的浏览器。 而不是让浏览器一一解析所有模块的导入,而是产生这样的网络瀑布……

<script type="module" src="./app.js"></script>


---> GET index.html
<---
    ---> GET app.js
    <---
        ---> GET html.js
        <---
            ---> GET lib.js
            <---

… 您将能够预先告诉浏览器页面需要html.jslib.js ,从而使瀑布受到控制:

<link rel="modulepreload" href="html.js">
<link rel="modulepreload" href="lib.js">
<script type="module" src="./app.js"></script>
---> GET /index.html
<---
      ---> GET app.js
      ---> GET html.js
      ---> GET lib.js
      <---
      <---
      <---

HTTP2 与服务器推送

与只能传递一个资源的 HTTP1.1 相比,HTTP2 能够在单个响应中推送多个资源。 这将有助于使通过网络的往返次数保持最少。

在我们的示例中,有可能在单个请求中传递index.htmlapp.jshtml.js

---> GET /index.html
<--- index.html
<--- app.js
<--- html.js
<--- lib.js

快取

交付多个较小的 ES 模块可能有益于缓存,因为浏览器仅需要获取已更改的模块。 产生大捆的问题在于,如果更改一行,则会使整个捆无效。

异步 / 延迟

默认情况下,ES 模块不是渲染阻止,例如<script defer> 。 如果您的模块不需要按照在 HTML 中定义的顺序执行,则还可以添加async以在下载后立即执行它们。

函数库

流行的库现在已开始以 ES 模块的形式发布,但是它们仍以捆绑器为目标,而不是直接导入。

这个小小的导入会触发 _640 个请求_的瀑布:

<script type="module">
  import \_ from 'https://unpkg.com/lodash-es'
</script>

如果我们做_正确的事情_ ,只是导入我们需要的一个函数,该怎么办? 我们仅有 119 个请求

<script type="module">
  import cloneDeep from 'https://unpkg.com/lodash-es/cloneDeep'
</script>

这只是一个示例,说明lodash-es尚未构建为直接在浏览器中加载。 为此,您仍然需要使用 ES 模块作为目标来创建自己的捆绑软件。

浏览器支持


如下表所示,浏览器对 ES 模块的支持很好(并且一直在不断改进)。

点击查看框架的源代码

我可以使用 es6-module 吗? 来自 caniuse.com 的主要浏览器对 es6-module 功能的支持数据。

现在是开始在浏览器中尝试 ES 模块的时候了。 很快,您将可以在没有编译器或捆绑器的情况下在所有现代浏览器中使用它们。

转载自:在浏览器中使用 ES 模块(blog.csdn.net)
原文链接: https://www.sitepoint.com/using-es-modules/

noVNC 相关

  1. Node.js Tcp server & Socket.io · GitHub
  2. Node.js TCP client and server example
  3. Socket通信Python实现 – 简书
  4. Python-TCP协议的socket实现通信 – 简书
  5. JavaScript中的缓冲数组和强类型数组 – 知乎
  6. NoVNC的使用、websockify以及VNC截图 | 学步园
  7. 通过noVNC和websockify连接到QEMU/KVM – RobertZhou的个人空间 – OSCHINA
  8. GitHub – novnc/websockify-js: JavaScript WebSocket to TCP bridge
  9. noVNC的使用之一 | vosamo
  10. websockify文档 – 贱书生 – 博客园
  11. Node.js Tcp server & Socket.io · GitHub
  12. Node.js TCP client and server example
  13. TCP编程 – 廖雪峰的官方网站
  14. 在Mac上通过Parallels Desktop安装linux操作系统Centos_weixin_38334440的博客-CSDN博客
  15. How to Install and Configure VNC Server in CentOS 7
  16. https://wiki.centos.org/zh/HowTos/VNC-Server#A.2BTjRl9mAnkcd1KA_x11vnc
  17. Linux Centos7.x下安装部署VNC的实操详述 – EasonV5 – 博客园 👌
  18. ArrayBuffer

macOS iTerm2无法使用rz并提示waiting-to-receive. **B0100000023be50.

运行 rz 会报类似错

rz waiting to receive.**B0100000023be50

原因

Mac 上的 iTerm2 不支持 rzsz ,需要在 iterm2 配置一下

安装 rz sz

brew install lrzsz

配置 iTerm2,添加 trigger

/usr/local/bin/ 创建两个脚本文件:

  • iterm2-send-zmodem.sh
  • iterm2-recv-zmodem.sh

文件内容可以复制这个仓库(iterm2-zmodem)里面的对应文件。

cd /usr/local/bin
sudo wget https://raw.github.com/Keystion/iterm2-zmodem/master/iterm2-send-zmodem.sh
sudo wget https://raw.github.com/Keystion/iterm2-zmodem/master/iterm2-recv-zmodem.sh
sudo chmod 777 /usr/local/bin/iterm2-*

<!–more–>

iTerm2

打开 iTerm2系统偏好设置,点击preferences → profiles,选择某个profile,如Default,之后继续选择advanced → triggers,添加编辑添加如下triggers

triggers1:

Regular expression: /*/*B0100
Action: Run Silent Coprocess
Parameters:/usr/local/bin/iterm2-send-zmodem.sh

triggers2:

Regular expression: /*/*B00000000000000
Action: Run Silent Coprocess
Parameters:/usr/local/bin/iterm2-recv-zmodem.sh

之后配置完,还遇到一个问题,就是不能上传,总是报sz skiped错误,查了很多也没解决方案。

之后,重启Mac电脑,再次进入,就ok了,也不知道原因是什么。

原因找到了是权限问题,sudo rz 搞定

如果搞不定还可以试试其他配置


原文地址:https://www.cnblogs.com/QuestionsZhang/p/10613884.html

库、插件、组件、控件、扩展?

库、框架、插件、加载项、拓展和控件都是组件。

组件(Component)是一个含义很大的概念,一般是指软件系统的一部分,承担了特定的职责,可以独立于整个系统进行开发和测试,一个良好设计的组件应该可以在不同的软件系统中被使用(可复用)。例如 V8 引擎是 Chrome 浏览器的一部分,负责运行 JavaScript 代码,这里的 V8 引擎就可以视为一个组件。V8 引擎同事也是 Node.js 的 JavaScript 解释器,这提现了组件的可复用性。

<!–more–>

库(Library)是一些列预先定好的数据结构和函数(对面向对象来说,是类)的集合,程序员通过使用这些数据结构和函数实现功能。例如 Moment.js 是 JavaScript 库,提供了处理时间的一些函数。

框架(Framework)也是一系列预先定义好的数据结构和函数,一般用户作为一个软件的骨架,但程序真正的功能还需要由开发者实现。框架和库的最大区别在于“控制反转”,当你使用一个库,你会调用库中的代码,而当你使用一个框架,框架会调用你的代码。框架和库是一个有交叉的概念,很多框架都是以库的形式发布的,例如 Java 的 Spring MVC 框架,其发布的 jar 包本身就是一个库。而一个库如果也能通过依赖反转的方式进行拖拽,那也可以视为一个框架,例如 Python 的 markdown 解释库 Python Markdown,可以添加自定义的解释拓展,那么可以被视为一个 Markdown 解释框架。

下面这张图出自这篇博客 Library vs. Framework?,从调用方式的角度比较了库和框架。

framework vs. library

插件(Plugin)和拓展(Extension)是两个很相似的概念,我没有办法在软件系统的角度给出这二者的区别。插件(或拓展)是对已有应用程序或者库的功能补充,一个软件的插件(或拓展)是实现了该软件预定义接口的组件,用来向已有的软件添加功能。插件在目标软件发布时可以不预先包含,而是在运行时被使用者注册,然后再被目标软件调用。另一个很接近的概念是加载项(Add-on),可以认为加载项是插件(或拓展)的子集,是仅针对应用程序来说的功能补充。一个插件的例子是 Flash 的浏览器插件,为浏览器实现了运行 Flash 程序的功能。

控件(Control)是 gui 编程的一个概念,一般来说一个最终用户可以看到的、可交互的组件、被视为一个控件。例如 .NET 编程中的 System.Windows.Contrals.Button 是一个控件。


原文:怎样精确区分这些名词:库、插件、组件、控件、扩展? – 龚世伟的回答 – 知乎

wwdc2020杂记

首图

昨天苹果WWDC20敲定了举行时间,2020年6月22日,Online。

看见这些卡通形象很生动,特此Mark以下。

全屏看上去还是很有feel的。https://developer.apple.com/wwdc20/

以下是全部卡通形象

R7
R3
R4
R5
R6
L5
L6
L7
M0
R1
R2
L1
L2
L3
L4