使用 fnm 管理多版本 Node.js

fnm(Fast and Minimal Node Manager)是一个相对较新的 Node.js 版本管理工具。它的设计目标是提供一个快速且轻量级的解决方案,用于安装、管理和切换不同版本的 Node.js
与 nvm(Node Version Manager)相比,fnm 强调更少的依赖和更快的启动速度,并且支持跨平台,Windows/Linux/Mac 都能用。

1、安装 fnm

全平台安装

如果你的电脑安装了 rust 环境,可直接用 cargo 安装

1
cargo install fnm

Linux/Mac 下安装

使用脚本安装

1
curl -fsSL https://fnm.vercel.app/install | bash

或者使用 brew 安装

1
brew install fnm

Windows 下安装

1
winget install Schniz.fnm

2、激活 fnm

Linux/Mac

1
2
eval "$(fnm env --use-on-cd --shell bash)"
source ~/.bashrc

Windows

将以下代码加入 PowerShell 的配置文件。

1
fnm env --use-on-cd --shell powershell | Out-String | Invoke-Expression

powershell 配置文件不同版本的windows 可能位置不一样,
可能位于 ~\.config\powershell\Microsoft.PowerShell_profile.ps1
也可能位于 ~\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
notepad $profile 或 (如果安装了VSCode)code $profile 命令即可打开编辑。

3、使用

1
2
3
4
5
6
7
8
fnm list # 查看本地已安装 Node.js 版本
fnm list-remote # 查看全部可安装的版本
fnm install 23 # 安装 Node.js v23 最新的子版本
fnm install --lts # 安装当前 lts 版
fnm use 23 # 使用 v23.x ,如 v23.1.0,仅当前终端切换,其它终端窗口不受影响
fnm use system # 使用系统的 Node.js(不是通过 fnm 安装的)
fnm default 23 # 把默认 Node.js 版本切换到 v23.x,所有终端默认的 Node.js 将使用该版本
fnm default system # 把默认 Node.js 切换到系统安装的程序

fnm 安装的 Node.js 程序位于 Windows 的 ~\AppData\Roaming\fnm\node-versions,Linux/Mac 的 ~/.local/share/fnm/node-versions
Node.js 对于一机多版本的需求没 Python 那么强,一般情况下安装当前 LTS 版就够用了。

Gradle 下载太慢,使用国内源加速

1、修改 gradle-wrapper

修改 gradle-wrapper.properties 文件的 distributionUrl 参数

1
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-bin.zip

2、更换仓库

项目根目录下的 build.gradle 文件的 buildscript.repositories 加入:

1
2
maven { url 'https://maven.aliyun.com/repository/google' } // Google Maven镜像
maven { url 'https://maven.aliyun.com/repository/public' } // Maven Central 镜像

3、执行 sync

记一次 tailwind @apply 编译速度极慢的解决过程

新的 Vue 项目使用了 Tailwind + SCSS,突然发现修改 app.scss 文件的时候,热更新需要 14s+ 才能加载完成。和之前项目唯一不同的是scss的 @import 换成了 @use,这地方应该没问题,sass 团队不可能会犯这么低级的错误。

突然想起,前两天把 128k 的地区数据 regions.js 放 src 目录下了,很有可能是这个引起的。试着把该文件移出 src 目录,还真是。解决:把该文件改为 json 格式,放到 assets 目录。

默认的 tailwind 配置会扫描源码目录下的 vue,js,ts,jsx,tsx 文件,js 文件过大太复杂的时候就会引起问题了。我项目只有 vue 文件需要taiwnid 扫描,把其他后缀去掉,热加载速度明显快很多。配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
// tailwind.config.js
/** @type {import('tailwindcss').Config} */
export default {
content: [
"./index.html",
// "./src/**/*.{vue,js,ts,jsx,tsx}",
"./src/**/*.vue",
],
theme: {
extend: {},
},
plugins: [],
}

PhpStorm / WebStorm 中 TailwindCSS 没有自动提示

PhpStorm / WebStorm 新建项目中,有时候 TailwindCSS 自动提示没有出来。
原因如下:

  • 1、只支用 npm,你项目可能用 pnpm 了
  • 2、IDE 设置的 Node 解释器可能跟你项目使用的解释器不对应。

打开 “设置 > 语言和框架 > Node.js”,选择“Node 解释器”为当前项目使用的 node 解释器。有时候项目在 wsl 中开发,默认是本地的 node,会导致问题。

Laravel 新旧版本模型属性访问器、修改器的选用

Laravel 9 之前模型属性访问器、修改器

通过 setFooBarAttribute($value)getFooBarAttribute() 方法来定义和访问自定义动态 fooBar 属性。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
/**
* 设置用户的名字
*/
public function setFirstNameAttribute($value)
{
$this->attributes['first_name'] = strtolower($value);
}

/**
* 获取用户的全名
*/
public function getFullNameAttribute()
{
return "{$this->first_name} {$this->last_name}";
}
}

Laravel 9 及之后版本的模型属性访问器、修改器

通过返回值类型为 Attribute 类来定义和访问自定义动态属性。

阅读更多

跨境电商系统多语言内容的设计方案

方案1:一个表设计一个多语言内容关联表

表解构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
- product_categories 
- id
- product_categorie_l10ns
- category_id # 关联 product_categories.id
- locale
- name
- products
- id
- category_id # 关联 product_categories.id
- product_l10ns
- product_id # 关联 products.id
- locale
- title
- desciption
- detail
阅读更多

WSL下配置AlpineLinux作为PHP开发环境

Alpine Linux 占用空间少,可定制性高,除了很适合跑 docker 容器外,也很适合跑在 wsl 中。

下载 WSL 版 Alpine Linux

打开链接 https://github.com/yuk7/AlpineWSL/releases 找到系统对应的 Alpine 版本,如 Alpine.zip,解压到你想要存放的位置,点击 Alpine.exe 文件即可安装好。

安装好后,将在 Alpine.exe 所在文件夹中创建 ext4.vhdx 虚拟磁盘文件,作为 AlpineLinux 的磁盘。控制台执行命令 wsl -l -v,将看到新安装的 wsl 发行版 Alpine

启动 Alpine

命令 wsl -d Alpine

使用国内镜像源

打开源配置:

1
vi /etc/apk/repositories

注释掉默认源:

1
2
#https://dl-cdn.alpinelinux.org/alpine/v3.18/main
#https://dl-cdn.alpinelinux.org/alpine/v3.18/community

加入阿里源配置:

1
2
http://mirrors.aliyun.com/alpine/v3.19/main
http://mirrors.aliyun.com/alpine/v3.19/community

或 加入腾讯源配置:

1
2
https://mirrors.cloud.tencent.com/alpine/v3.19/main
https://mirrors.cloud.tencent.com/alpine/v3.19/community

执行更新命令更新源数据和已安装的apk包:

1
apk -U upgrade

部署PHP 8.2

1
2
3
4
5
apk add php82 php82-pear php82-dev php82-pdo_mysql \
php82-iconv php82-mbstring php82-tokenizer \
php82-session php82-dom curl php82-curl \
php82-xmlwriter php82-fileinfo php82-posix \
redis php82-pecl-redis

82 改为 8183 即为安装 php-8.1 或 php-8.3
如果出现错误,apk add gcc,``

如果安装 php-8.1 出现一下错误:

1
2
3
4
5
6
7
ERROR: unable to select packages:
php81-pecl-msgpack-2.2.0-r0:
conflicts: php82-pecl-msgpack-2.2.0-r0[php-msgpack=2.2.0-r0]
satisfies: php81-pecl-redis-6.0.2-r0[php81-pecl-msgpack]
php82-pecl-msgpack-2.2.0-r0:
conflicts: php81-pecl-msgpack-2.2.0-r0[php-msgpack=2.2.0-r0]
satisfies: php82-pecl-redis-6.0.2-r0[php82-pecl-msgpack]

安装脚本中去掉 php82-pecl-redis再执行。

php8 版本切换

如果同时安装多个 php 版本,可通过脚本来更换默认版本php。

创建脚本 vi /usr/php-switch,输入以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/bash
cd /usr/bin

rm -f php php-config phpize pecl phar phar.phar

v=${1:-82}

ln -s php${v} php
ln -s php-config${v} php-config
ln -s phpize${v} phpize
ln -s pecl${v} pecl
ln -s phar.phar${v} phar
ln -s phar.phar${v} phar.phar

echo '已切换到php'$v

设置权限为可执行 chmod +x /usr/php-switch

1
2
3
4
5
6
7
8
# 默认切换到php 8.2
php-switch

# 切换到php 8.1
php-switch 81

# 切换到php 8.3
php-switch 83

安装 Nodejs

1
apk add icu-data-full nodejs npm

少儿学习编程有什么意义?

少儿学习编程有很多意义,主要体现在以下几个方面:

1、培养编程思维能力

编程思维(也叫计算思维)是一种解决问题的思维方式,它强调的是把问题分解成更小的部分,然后逐个解决。编程思维的核心是抽象模块化自动化。在学习编程的过程中,孩子可以练习如何运用编程思维来解决问题,孩子需要理解问题、拆解问题、抽象问题、设计解决方案、实施方案等一系列步骤。这种思维方式强调从问题到解决方案的转化过程,培养了孩子的逻辑思维和分析问题的能力。

这可以帮助孩子提高解决问题的能力,并为未来的学习和工作打下基础。

阅读更多

什么是编程思维?简化问题的艺术

1、编程思维

编程思维 不是编写程序的技巧,而是一种解决问题的思维方式,它强调的是把问题分解成更小的部分,然后逐个解决。编程思维的核心是抽象模块化自动化

  • 抽象 是指将问题简化为更基本的概念。例如,在编写一个计算两个数之和的程序时,我们可以将问题抽象为“将两个数字相加”。

  • 模块化 是指将问题分解成更小的部分。例如,在编写一个绘制正方形的程序时,我们可以将问题分解为以下几个步骤:

    • 绘制一条线
    • 旋转 90 度
    • 再绘制一条线
    • 再旋转 90 度
    • 重复步骤 1 到 4,直到绘制完成
  • 自动化 是指使用计算机程序来解决问题。例如,在编写一个计算两个数之和的程序时,我们可以使用计算机程序自动完成计算过程。

阅读更多

AI训练没有GPU独显?教你使用魔搭免费提供的阿里云端 cuda GPU

魔搭 笔记本中,可免费使用阿里云提供的AI计算资源:100小时免费的GPU计算资源,长期免费的CPU计算资源。

提供资源的配置参数

1
2
3
CPU 8核
REM 32G
GPU 可选:无GPU、16G、24G

使用教程

  • 注册魔搭账号,关联阿里云账号

  • 打开我的Notebook

  • 选择计算环境(CPU/GPU),CPU 环境长期免费,GPU环境有100小时免费(启动后才计时,停止或后就不计时了)

  • 选择预装镜像,根据你需要的 cuda、torch、TensorFlow 版本来选择。

  • 点击“启动”按钮,等待一两分钟就启动好实例了

  • 点击“查看Notebook”就可以开始使用了。

  • 可以在笔记本中直接运行系统命令或python代码。如运行:!nvcc -V 查看 NVIDIA、CUDA 的版本信息。

  • 可以打开终端执行命令,比如运行ps -e fpython -V

评价

魔搭好的方面是:使用方便,注册登录账号就可以立即使用计算资源。
不好的地方主要是:

  • 实例关闭后,镜像数据会被清空。
  • 环境给予 Ubuntu,需要会一点 Linux 命令用起来才更熟练。

后续

魔搭给的免费GPU环境只有100个小时,关闭后数据还被清空,是不是不够用?接着看我们下一期《免费3个月的阿里云端 Cuda GPU 计算(使用教程)》。