July 2, 2025
本文主要聚焦于 WebAssembly 的核心规范(Core Spec)部分。WASI 和 Embedder Spec 等其他部分并非本文的重点,感兴趣的读者可自行查阅相关资料。
目的
#
随着 Web 技术的普及,越来越多的应用场景(如游戏、音视频处理、AI 等)需要在浏览器中运行。这些场景通常涉及 CPU 密集型任务,而现有 Web 引擎在处理此类任务时,性能仍不及原生语言。此外,C/C++ 等语言已积累了大量成熟的库,为了高效复用这些库以扩展 Web 的能力,急需一种新方式,使 C++/Rust 等语言也能在浏览器环境中运行。
为解决上述问题,W3C 提出了 WebAssembly 规范。该规范设计了一种全新的、与机器无关的汇编指令集、运行时(可理解为虚拟机)以及内存模型等。
WebAssembly 规范发布后,各大浏览器厂商迅速跟进支持,使其成为一种跨平台的二进制格式,能够在不同操作系统和硬件平台上运行。WASM 的应用范围也因此不再局限于 Web 场景,而是扩展到移动端、服务器端等领域。在云原生领域,Envoy、Kong 和 Apisix 等项目已支持 WASM 作为其扩展插件。WasmEdge 更进一步,直接提出将 WASM 应用于边缘计算场景,例如无服务器应用和函数即服务等。
核心概念
#
在最新规范中,WebAssembly 定义了以下核心概念:
概念 |
解释说明 |
Values |
提供四种基础数值类型:32位和64位的整型及浮点型。32位整型可用于表示布尔值或内存地址。另有128位扩展整型用于高精度计算。 |
Instructions |
基于栈式虚拟机执行的指令,分为简单指令和控制指令两类。 |
Traps |
类似异常机制,当发生非法操作(如越界访问)时立即中止执行并报告宿主环境。功能类似于Go/Rust中的panic。 |
Functions |
与其他编程语言一致,用于组织特定功能的代码,接收参数并返回结果。 |
Tables |
数据结构上是一个数组,用于存储特定类型(funcref 和externref ),可通过索引模拟函数指针。 |
Linear Memory |
一段可动态增长的连续字节数组,程序可存储和加载其中任意位置的数据,越界访问会触发Trap。 |
Modules |
包含类型、函数、表、内存和全局变量的定义,作为部署、加载和编译的基本单位。可声明导入导出项,并支持定义自动执行的启动函数。 |
Embedder |
指将WebAssembly程序嵌入宿主环境的实现方式,如wasmtime或Web环境中的WebAssembly运行时。 |
举例分析
#
接下来,我们将结合一个简单的 WASM 程序来辅助理解 WebAssembly 规范的内容。这里使用 Rust 语言编写一个简单的加法程序,并将其编译为 WASM 模块:
...
May 18, 2018
需要的技术及工具:
- Python3 + Selenuium
- Golang net/http
- React-Native 相关(使用了react-navigation)
- MongoDB
- Redis
代码地址:
项目构思及构成
#
食谱类型的App,应用市场肯定有更好的的食谱APP。所以自己开发的目的,首先是写代码,其次是定制APP~
好的,现在化身产品经理,设计一下APP有哪些功能:
- 每日菜谱推荐,推荐可更换
- 每天需要准备的材料提醒
- 发现更多菜谱
- 分类筛选菜谱
- 搜索菜谱
- 查看菜谱详情
- 设置(不知道设置啥,提前准备吧)
设计稿?不存在的,随心所欲。
现在分析下我需要做的事情:
- 能跑起来的APP,与restful web api 交互。
- 能跑起来的web-api,提供菜谱数据,筛选,推荐,搜索等功能
- 能跑起来的简易spider,从网上获取菜谱信息。(这个爬虫能解析动态生成网站就够用了,姑且称之为爬虫吧)
没有考虑大量数据,因此爬虫并不通用,只适合特定XX网站。
实战爬虫
#
这个APP里面最重要的就是菜谱数据了,那么开发之前,需要明确的数据格式,如下:
{
"name": "name",
"cat": "cat",
"img": "img_url",
"mark_cnt": 19101,
"view_cnt": 181891,
"setps": [
{
"desc": "",
"img": "",
},
// more step
],
"material": {
"ingredients": [
{
"name": "ingredients_name",
"weight": "ingredients_weight",
},
// more ingredients
],
"seasoning": [
{
"name": "seasoning_name",
"weight": "seasoning_weight",
},
// more seasoning
],
},
"create_time": "2018xxxxxx",
"update_time": "2018xxxxxx",
}
目标
#
前提:无法直接获取到该网站的服务API,才使用爬虫间接获取数据。
...
January 23, 2018
docker + selenium + python 构建前端自动化分布式测试环境。利用seleninum-grid分布式框架,python编写测试代码,docker部署来进行前端自动化测试
2018-2-1 更新 使用docker-compose编排
分布式部署的优点
#
自动化的优缺点就不再重复了,主要分析下docke部署和分布式的优势
- 提高自动化的测试效率(分布式)
- 方便打包和持续集成(docker)
- 解决多人coding,却因为路径不一致导致无法运行的问题(当然也可以通过其他方式来解决~)
这里还有一个问题就是:使用docker部署方式运行测试代码,是看不见本地浏览器启动的,因此在调试测试代码的时候,需要一定的工具来协助,譬如VNC viewer
开篇-selenium
#
大家都知道 Selenium 是支持多种浏览器多个编程语言的一个自动化测试工具。而 Selenium Grid 是一种可以让用户在不同的环境和不同的浏览器上并行运行 web 测试用例的框架。换而言之,使用 Selenium Grid 可以让我们在分布式测试环境下执行测试,例如 Windows,Linux,Mac OS,Andoid/iOS 等等,这样可以大大减少重复的工作量,提高我们的工作效率。
selenium分布式结构如图:

搭建分布式环境
#
在Dockerhub已经具有了相应的selenium的镜像,我们直接使用就行了
拉取镜像
#
docker pull selenium/hub
docker pull selenium/node-chorme-debug
关于node-chrome-debug
和node-chrome
的区别:
暂未研究
运行容器
#
docker run -d -p 4444:4444 --name sel-hub selunium/hub # 运行hub服务
docker run -d -p 5900:5900 --link sel-hub:hub selunium/node-chrome-debug # 运行slenium chrome 节点
# more node could append like node-chrome-debug
查看节点信息
#
在浏览器中打开http://127.0.0.1:4444/grid/console
这里需要注意的是,如果是在本地运行的容器,并映射4444端口,因此得到127.0.0.1:4444,如果是在虚拟机中运行,ip和端口应该根据网络来获取相应的IP和PORT
...
January 13, 2018
pytest最常用法总结,当然不止这一点功能。关于更多更强大的插件,可以根据自己需要来定制。
安装
#
pytest 安装和使用都非常简单, 只需pip install pytest
编写测试代码
#
使用pytest,不需要像unittest模块一样,pytest使用的是python自带的assert
,如:
def test_global_function():
assert 1 == 1
使用pytest.mark
#
pytest.mark 用于给测试方法打上标签,在稍后的执行中会讲到如何使用marker
@pytest.mark.marker_self
def test_global_function():
assert 1 == 1
使用pytest.fixture
#
@pytest.fixture
def google_url():
return "http://google.com"
setup 和 teardown
#
setup
和teardown
方法作用范围,分为全局作用,类作用,方法作用
- 全局:作用于全局测试函数
- 类: 作用于自身类
- 类方法: 作用于类函数
简单举例:
#
# 全局
def setup_function(function):
print("setup function global")
def teardown_function(function):
print("teardown function global")
# 类
class Test_fixture:
@classmethod
def setup_class(cls):
print("class setup method")
@classmethod
def teardown_class(cls):
print("class teardown method")
# 类方法
def setup_method(self, method):
print("class method setup function")
def teardown_method(self, method):
print("class method teardown function")
pytest配置文件
#
配置文件名为pytest.ini
setup.cfg
tox.ini
关于配置文件优先级请查阅官方文档
简单举例:
...