加载笔记列表...
加载笔记列表...
记录灵感与思考的地方
copy
函数可以让你在 console
里拿到任意的资源,甚至包括一些变量,在复制一些特别冗长的数据时特别有用,当复制完成后,直接使用 ctrl + v
即可。
copy
接受一个变量作为参数,如果有多个参数,则忽略第一个后面的所有参数,当需要复制不存在变量名的数据时,可以配合 Store As Global
来使用。
当我们从控制台获取一些数据却没有变量名时(在开发时特别常见),可以通过右键点击数据旁的小三角形,通过其来储存为全局变量,变量名为 temp1
一直延续下去,就可以配合 copy
获取变量名打印了,该功能对 HTML 元素同样适用。
'_' allowed only in math mode
The reason for this is that the -full
version includes all the extensions, including the textmacros
extension. Normally, the contents of \text{}
and other text-mode material is not processed further by MathJax (other than any math-mode material that it contains), but the textmacros
extension enables processing of (some) macros within the text-mode material. That also enables processing of special characters, like the underscore (which is only allowed in math mode).
You can either use \_
in place of the underscore, or remove the textmacros
extension from the TeX packages to use. To do the latter, use
1<script>
2window.MathJax = {
3 tex: {
4 packages: {'[-]': ['textmacros']}
5 }
6}
7</script>
8
never 在 TS 中表示的是永远不会出现或者不存在的值。
一个简单的例子, 一个永远不会有返回值的函数:
1function foo(): never {
2 throw new Error('error')
3}
4
5function infiniteLoop(): never {
6 while (true) {
7 }
8}
9
有什么实际的使用场景呢?
比如我们可以用 never 排除一些我们不想要的值。
1type NonNullable<T> = T extends null | undefined ? never : T
2type FOO = NonNullable<number | null> // number
3
或者用于避免 switch case 或 if else 中会遗漏一些条件
1type Foo = 'a' | 'b'
2function fn(x: Foo) {
3 switch(x){
4 case 'a':
5 // ...
6 case 'b':
7 // ...
8}
9// 如果有一天将 Foo 的类型改为了 type Foo = 'a' | 'b' | 'c'
10// 上面的代码并不会报错,但却遗漏了对 'c' 的处理
11// 改为下方代码
12type Foo = 'a' | 'b'
13function fn(x: Foo) {
14 switch(x){
15 case 'a':
16 // ...
17 case 'b':
18 // ...
19 default:
20 // 如果我们将 Foo 改为 'a' | 'b' | 'c'
21 // 这里就会有 Type 'string' is not assignable to type 'never' 的报错
22 // 从而避免遗漏条件
23 const _exhaustiveCheck: never = x;
24 return _exhaustiveCheck;
25}
26
https://www.typescriptlang.org/docs/handbook/2/functions.html#never
https://stackoverflow.com/questions/42291811/use-of-never-keyword-in-typescript
https://www.typescriptlang.org/docs/handbook/2/narrowing.html#the-never-type
在现代前端开发中,包管理工具如 npm 为我们提供了极大的便利。然而,随着依赖生态系统的复杂化,供应链攻击的风险也在增加。近期,Vant 组件被投毒的事件引起了广泛关注,攻击者通过篡改 postinstall
脚本,试图在用户系统中执行恶意代码。为应对此类威胁,pnpm 提供了 onlyBuiltDependencies
和 onlyBuiltDependenciesFile
配置选项,帮助开发者在安装依赖时限制哪些包可以执行安装脚本,从而提升项目的安全性。
理解 postinstall
脚本的风险
在 npm 包的 package.json
文件中,postinstall
脚本会在包安装完成后自动执行。虽然这对于执行必要的构建步骤或初始化操作非常有用,但也可能被恶意者利用,执行未经授权的代码,危及系统安全。
pnpm 的安全特性
pnpm 作为高性能的包管理工具,提供了更细粒度的控制,允许开发者指定哪些依赖可以在安装过程中执行脚本。这主要通过以下两个配置实现:
onlyBuiltDependencies
:此字段允许在安装期间执行安装脚本的包名列表。如果此字段存在,那么只有列出的包能够运行安装脚本。
示例:
1{
2 "pnpm": {
3 "onlyBuiltDependencies": ["fsevents"]
4 }
5}
6
在上述配置中,只有 fsevents
包被允许在安装时执行其安装脚本。
onlyBuiltDependenciesFile
:此配置选项允许用户指定一个 JSON 文件,该文件列出了在 pnpm 安装过程中允许运行安装脚本的包。通过使用它,可以增强安全性或确保在安装过程中只有特定的依赖项执行脚本。
示例:
1{
2 "dependencies": {
3 "@my-org/policy": "1.0.0"
4 },
5 "pnpm": {
6 "onlyBuiltDependenciesFile": "node_modules/@my-org/policy/onlyBuiltDependencies.json"
7 }
8}
9
在 onlyBuiltDependencies.json
文件中,应包含允许执行安装脚本的包名称列表:
1[
2 "fsevents"
3]
4
实施步骤
确定可信赖的依赖包:审查项目中的依赖,确定哪些包确实需要在安装时执行脚本。
配置 pnpm
设置:在项目的 package.json
中,添加 pnpm
字段,并根据需要使用 onlyBuiltDependencies
或 onlyBuiltDependenciesFile
进行配置。
创建 onlyBuiltDependencies.json
文件(如果适用):如果选择使用 onlyBuiltDependenciesFile
,则需要在指定路径创建包含允许执行安装脚本的包名称列表的 JSON 文件。
测试和验证:运行 pnpm install
,确保只有指定的包执行了安装脚本,并验证项目功能正常。
注意事项
定期更新依赖:保持依赖包的更新,及时获取安全补丁,减少被攻击的风险。
监控安装日志:在安装过程中,关注 pnpm 的日志输出,确保未授权的包未尝试执行安装脚本。
教育团队成员:确保团队中的所有开发者了解这些安全措施的重要性,并在各自的项目中加以实施。
通过合理配置 pnpm 的 onlyBuiltDependencies
和 onlyBuiltDependenciesFile
,可以有效防范因 postinstall
脚本被投毒而引发的安全问题,保障项目的安全性和稳定性。
当尝试访问某些网站时,可能会遇到如下错误提示:
“Chrome 此次尝试连接到该网站时,该网站发回了异常的错误凭据。这可能是因为有攻击者在试图冒充该网站,或者 Wi-Fi 登录屏幕中断了此次连接。请放心,您的信息仍然是安全的,因为 Chrome 尚未进行任何数据交换便停止了连接。”
此错误通常与浏览器中的 HSTS(HTTP Strict Transport Security) 设置有关。HSTS 是一种 Web 安全协议,它强制浏览器与服务器之间的连接必须使用 HTTPS。如果浏览器已经与网站建立过 HTTPS 连接并启用了 HSTS,它将强制所有后续连接也使用 HTTPS。这意味着,即使网站出现了证书错误或连接问题,浏览器依然会尝试通过 HTTPS 进行访问,导致连接失败。
此外,错误提示中提到的攻击或网络中断情况通常是暂时的,但由于 HSTS 设置,浏览器会强制使用 HTTPS 进行连接,可能导致暂时无法访问该网站。此类问题一般是暂时的,稍后可能会恢复正常。
如果你确实无法访问该网站并且怀疑问题与浏览器的 HSTS 设置有关,可以按照以下步骤清除相关的 HSTS 设置,解决该问题。
步骤:
chrome://net-internals/#hsts
。步骤:
~/Library/Cookies/HSTS.plist
文件。步骤:
about:permissions
(仅适用于 Firefox 45 及以下版本)。注意: 从 Firefox 45 版本开始,about:permissions
页面已被移除,因此该方法仅适用于 45 版本之前的 Firefox 浏览器。
1# ==========================================================
2# NPM
3# ==========================================================
4
5npm set registry https://registry.npmmirror.com # 注册模块镜像
6npm set disturl https://npmmirror.com/mirrors/node # node-gyp 编译依赖的 node 源码镜像
7
8## 以下选择添加
9npm set sass_binary_site https://registry.npmmirror.com/mirrors/node-sass # node-sass 二进制包镜像
10npm set electron_mirror https://registry.npmmirror.com/mirrors/electron/ # electron 二进制包镜像
11npm set puppeteer_download_host https://registry.npmmirror.com/mirrors # puppeteer 二进制包镜像
12npm set chromedriver_cdnurl https://registry.npmmirror.com/mirrors/chromedriver # chromedriver 二进制包镜像
13npm set operadriver_cdnurl https://registry.npmmirror.com/mirrors/operadriver # operadriver 二进制包镜像
14npm set phantomjs_cdnurl https://registry.npmmirror.com/mirrors/phantomjs # phantomjs 二进制包镜像
15npm set selenium_cdnurl https://registry.npmmirror.com/mirrors/selenium # selenium 二进制包镜像
16npm set node_inspector_cdnurl https://registry.npmmirror.com/mirrors/node-inspector # node-inspector 二进制包镜像
17npm set sentrycli_cdnurl https://npmmirror.com/mirrors/sentry-cli/ # sentry-cli
18
19npm cache clean --force # 清空缓存
20
.npmrc
设置1registry=https://registry.npmmirror.com
2disturl=https://npmmirror.com/mirrors/node
3sass_binary_site=https://registry.npmmirror.com/mirrors/node-sass
4electron_mirror=https://registry.npmmirror.com/mirrors/electron/
5puppeteer_download_host=https://registry.npmmirror.com/mirrors
6chromedriver_cdnurl=https://registry.npmmirror.com/mirrors/chromedriver
7operadriver_cdnurl=https://registry.npmmirror.com/mirrors/operadriver
8phantomjs_cdnurl=https://registry.npmmirror.com/mirrors/phantomjs
9selenium_cdnurl=https://registry.npmmirror.com/mirrors/selenium
10node_inspector_cdnurl=https://registry.npmmirror.com/mirrors/node-inspector
11sentrycli_cdnurl=https://npmmirror.com/mirrors/sentry-cli/
12