Files
markdown/blog/1.技术栈/985.Nuxt UI Pro.md
2025-08-08 10:01:03 +08:00

133 lines
3.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: Nuxt UI Pro
description: Nuxt 被收购后预计在9月发布 Nuxt UI Pro v4,并且全免费
date: 2025-07-25
img: https://lijue-me.oss-cn-chengdu.aliyuncs.com/20250723114628628.png
navigation:
icon: simple-icons:nuxtdotjs
---
Nuxt 被收购后预计在9月发布 Nuxt UI Pro v4,并且全免费。
于是把最近在做的项目 UI 组件换成了 Nuxt UI Pro。
不过9月才免费现在就忍不住上了组件总不至于去缴几百美元的费用吧。
![image.png](https://lijue-me.oss-cn-chengdu.aliyuncs.com/20250723110524418.png)
于是先绕过一些验证过程,体验一下“学习版”。
做一个 shell 脚本在项目根目录下执行即可完成跳过。pnpm i 安装完或者更新完依赖就执行一次即可。
```bash [.shell]
# 绕过 UI Pro 的 License 验证
set -euo pipefail
# 1. 禁用 module.mjs 的调用
MODULE="node_modules/@nuxt/ui-pro/dist/module.mjs"
if [[ -f $MODULE ]]; then
sed -i.bak '/await validateLicense({.*rootDir })/s/^/\/\//; /^await validateLicense({.*rootDir })/s/^/\/\//' "$MODULE"
rm -f "$MODULE.bak"
echo "✅ module.mjs 已屏蔽"
fi
# 2. 直接“替换函数” fake 200
SHARED="node_modules/@nuxt/ui-pro/dist/shared"
JS=$(find "$SHARED" -maxdepth 1 -name 'ui-pro.*.mjs' | head -n1)
[[ -z $JS || ! -f $JS ]] && { echo "⚠️ ui-pro.*.mjs 未找到"; exit 0; }
cat <<'EOF' > tmp_func.mjs
async function validateLicense(opts) {
/* --- patched --- */
return { status: 200 }
}
EOF
sed -i.bak '/^async function validateLicense[^(]*(/,/^\}$/c\
async function validateLicense(opts) {\
/* --- patched --- */\
return { status: 200 }\
}\
' "$JS"
rm -f "$JS.bak" tmp_func.mjs
echo "✅ $JS 已 mock 完成"
echo "🎉 License ⛔ Done!"
```
### 以上脚本是自动化完成以下操作:
修改 `node_modules\@nuxt\ui-pro\dist\module.mjs`
```js
nuxt.hook("build:before", async () => {
// 注释掉这行
// await validateLicense({ key, theme: theme$1, dir: nuxt.options.rootDir });
});
```
修改 `node_modules/@nuxt/ui-pro/dist/shared/ui-pro.CsgJ05mi.mjs`
此目录下 ui-pro.xxx.mjs 名称是随机生成
```js
async function validateLicense(opts) {
//注释下方代码
// if (!opts.key) {
// throw _createError(`Missing \`${opts.theme.env}\` license key.
// Purchase Nuxt UI Pro at \`${opts.theme.link}\` to build your app in production.`);
// }
// const gitInfo = opts.key !== "oss" ? void 0 : await _getLocalGitInfo(opts.dir) || _getGitEnv();
// const projectName = gitInfo ? `${gitInfo.owner || ""}/${gitInfo.name || ""}` : await _getPkgName(opts.dir);
// try {
// await ofetch("https://api.nuxtlabs.com/ui-pro/verify", {
// headers: {
// "Authorization": `key ${opts.key}`,
// "x-nuxt-project": projectName
// },
// params: gitInfo ? {
// gitRepo: gitInfo.name,
// gitOrg: gitInfo.owner,
// gitUrl: gitInfo.url
// } : {}
// });
// } catch (error) {
// const statusType = Math.round(error.status / 100);
// if (statusType === 4) {
// throw _createError(`Invalid \`${opts.theme.env}\` license key.
// Purchase Nuxt UI Pro at \`${opts.theme.link}\` to build your app in production.`);
// }
// throw _createError("Cannot validate Nuxt UI Pro License: " + error);
// }
/手动添加返回 200 状态值
const response = {
status: 200,
};
return response;
}
```