SyntaxError: Cannot use import statement outside a module 错误处理

在使用 vite 时,有个需求是把项目拷贝到另一个目录下运行,出现以下错误 SyntaxError: Cannot use import statement outside a module

运行 npm run build 时,出现类似以下的错误:

1
2
3
4
node_modules/vite/bin/vite.js:2
import { performance } from 'node:perf_hooks'

Cannot use import statement outside a module

这个报错有三种情况,大家可以依据各自的情况进行处理。

情况1:node_modules缓存

这种情况是由于 node_modules 缓存的文件,这时只要删除 node_modules ,并重新安装依赖包。

1
npm install

再重新运行即可解决。

情况2:node版本较低

Vite 要求 Node.js 版本大于 18+ 20+,如果不满足,请升级本机的 npm 版本

情况3:

脚本没有在 module 范围内执行,例如写成下面的形式会报错

1
<script src="./file.js"></script>

需要改成

1
<script type="module" src="./file.js"></script>

Uncaught ReferenceError: Buffer is not defined 的错误处理

在使用 xml2json 包时,发现使用 json2xml 函数时,出现以下错误 Uncaught ReferenceError: Buffer is not defined

查看代码发现报错语句为 json2xml.js 的第 4 行:

1
if (json instanceof Buffer) 

这是因为在某些情况下,Buffer 包不存在。

跨域请求获取不到特定 header 头的解决办法

一个需求是这样:要用 js 来读 ajax 接口中的header头的某个字段,例如 Etag
这时有可能出现两种报错信息。
第一:全部 Response 字段里获取不到指定字段。

1
2
3
4
5
console.log(xhr.getAllResponseHeaders());
/*
content-length: 44
content-type: application/json; charset=utf-8
*/

发现没有 Etag 这个字段。

DNS 基础知识

在排查一些DNS 问题时,顺便学了些DNS的基础知识,记录一下。

什么是根、顶级、权威、本地域名服务?

域名解析过程涉及4个DNS服务器,分别如下:

分类 作用
根DNS服务器 英文:Root nameserver。本地域名服务器在本地查询不到解析结果时,则第一步会向它进行查询,并获取顶级域名服务器的IP地址。
顶级域名服务器 英文:Tld nameserver。负责管理在该顶级域名服务器下注册的二级域名,例如 www.example.com,.com则是顶级域名服务器,在向它查询时,可以返回一级域名“example.com”所在的权威域名服务器地址。
权威域名服务器 英文:authoritative nameserver。在特定区域内具有唯一性,负责维护该区域内的域名与IP地址之间的对应关系,例如云解析DNS。
本地域名服务器 英文:DNS resolver或Local DNS。本地域名服务器是响应来自客户端的递归请求,并最终跟踪直到获取到解析结果的DNS服务器。例如用户本机自动分配的DNS、运营商ISP分配的DNS、谷歌/114公共DNS等。
  
 DNS

CoreDNS 的 template、hosts、file 插件使用方法

CoreDNS 是一个开源的域名系统(DNS)服务器,用于将域名解析为 IP 地址以实现网络通信。它是一个用 Go 语言编写的可扩展 DNS 服务器,旨在取代传统的 DNS 服务器并提供更灵活、可配置的解析方案。

安装配置

一个极简的Corefile配置如下

1
2
3
4
.:PORT {
whoami
log
}

DNS服务默认端口为53。本机测试期间,选择使用 1053 端口。

首先创建名为 Corefile1 的配置文件,内容如下:

1
2
3
4
.:1053 {
whoami
log
}

启动 coredns 服务:

1
2
3
4
% coredns -conf ./Corefile1
.:1053
CoreDNS-1.11.1
darwin/arm64, go1.21.0,

使用hosts插件

在某个项目中,我要用CoreDNS来 为特定域名指定hosts。这时用到了 hosts 插件。

例如:要实现把 a.example.com 指向 192.168.1.2。

canvas toDataURL方法中的quality参数对PNG图片不生效

在使用 canvas 生成图片时,使用到了 toDataURL 的方法。

1
canvas.toDataURL("image/png",quality);

对于参数 0 <= quality <= 1quality 越小,压缩质量越差,生成的图片尺寸越小,图像越模糊。
对于 jpg 格式的图片,这个参数是生效的。但对于 png 格式的图片,无论 quality 是任何值,最终生成的图片都一样的体积。

这是因为 png 格式输入无损图片格式,不管怎么设置,quality 永远等于 1。

这就是 quality 参数对 png 格式图片不生效的原因。

只有在指定图片格式为 image/jpegimage/webp 的情况下,可以从 0 到 1 的区间内选择图片的质量。也就是说 quality 参数只对 jpgwebp 图片有效。

PNG 图片如何压缩?

一般而言,压缩 PNG 图片,需要对图片进行重新采样,即把相似的颜色进行合并,这种技术被称作“量化(quantization)”。在线工具可以使用 图片压缩优化工具

参考资料:Canvas toDataURL文档

重新思考 CAP 定理

CAP Theorem: Revisited 译文

记录:两个月之前,我写了一篇博客来解释 CAP 定理。发表之后我意识到,我在这个主题上的思考已经非常过时,并且不适应于真实世界。我尝试在这篇博客上弥补该缺陷。

在当今的技术环境中,当需要额外的资源(计算,存储等)以在合理的时间范围内成功完成工作负载时,我们见证了对系统进行扩展的强烈且不断增长的需求。这可以通过向系统添加其他商品硬件来处理增加的负载来实现。 这种扩展策略的结果是系统增加了额外的复杂度。 这就是 CAP 定理起作用的地方。

Go 语言 Channel 简明教程

channnel 中文译作通道。通道的核心是通信(signaling)。一个通道允许一个 goroutine 向另一个 goroutine 发送关于特定事件的信号。把通道看作一种信号机制(signaling mechanism),将帮助你写出更好的代码,和更精确的行为。
为了理解信号是如何工作的,我们必须理解三个特性:

  • 投递可靠性保障(Guarantee Of Delivery)
  • 状态(State)
  • 是否携带数据(With or Without Data)

这三个特性设计了一种信号机制。

  

:D 一言句子获取中...