nuxt3、pm2、unocss 初体验之一波三折,简单记录下结果还算圆满的第一步

999 阅读4分钟

前言介绍

想着给自己的网站更新迭代下,学习点新东西。

技术

nuxt3
unocss原子化css
pm2

nuxt3 开始【差点开始即结束】

创建项目 npx nuxi@latest init my-appnpx nuxi init <project-name>pnpm dlx nuxi init <project-name> ,报错~ 报错~ 报错~ 都不成功。
官网提示【 Node.js - v16.10.0 or newer】,用 nvm 包管理工具,下载 nvm install 18.12.1,老样子报错。再想是不是版本太高的问题,但是继续 nvm install 16.19.1,下了个16+最高的版本,还是不行。
然后开始怀疑包管理工具下载下来是不是没有生效,使用终极技能 关机重启

npx nuxi init my-app 报错:

npm ERR! Unexpected token '.'

npm ERR! A complete log of this run can be found in:
npm ERR!     C:\Users\xxx\AppData\Local\npm-cache\_logs\2023-04-05T14_22_35_939Z-debug-0.log

pnpm dlx nuxi init my-app 报错:

 ERROR  Error: Failed to download template from registry: fetch failed                                        23:00:50ERRORCommand failed with exit code 1: nuxi init my-app

pnpm: Command failed with exit code 1: nuxi init my-app
    at makeError (C:\Users\yezengqian\AppData\Roaming\npm\node_modules\pnpm\dist\pnpm.cjs:23113:17)
    at handlePromise (C:\Users\yezengqian\AppData\Roaming\npm\node_modules\pnpm\dist\pnpm.cjs:23684:33)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    at async Object.handler [as dlx] (C:\Users\yezengqian\AppData\Roaming\npm\node_modules\pnpm\dist\pnpm.cjs:218968:7)
    at async C:\Users\yezengqian\AppData\Roaming\npm\node_modules\pnpm\dist\pnpm.cjs:226695:21
    at async main (C:\Users\yezengqian\AppData\Roaming\npm\node_modules\pnpm\dist\pnpm.cjs:226662:34)
    at async runPnpm (C:\Users\yezengqian\AppData\Roaming\npm\node_modules\pnpm\dist\pnpm.cjs:226894:5)
    at async C:\Users\yezengqian\AppData\Roaming\npm\node_modules\pnpm\dist\pnpm.cjs:226886:7

one year later ~~

不知道是不是网络问题,尝试切换网络,用手机热点。pnpm dlx nuxi init my-app
结果成功了~~~

D:\xx\nuxtjs>pnpm dlx nuxi init my-app
../../.pnpm-store/v3/tmp/dlx-7720        |   +1 +
../../.pnpm-store/v3/tmp/dlx-7720        | Progress: resolved 2, reused 1, downloaded 0, added 1, done
Nuxi 3.3.3                                                                  22:56:48

 ERROR  (node:18548) ExperimentalWarning: The Fetch API is an experimental feature. This feature could change at any time
(Use `node --trace-warnings ...` to show where the warning was created)

✨ Nuxt project is created with v3 template. Next steps:                    22:56:52
 › cd my-app                                                                 22:56:52
 › Install dependencies with npm install or yarn install or pnpm install     22:56:52
 › Start development server with npm run dev or yarn dev or pnpm run dev     22:56:52

继续测试出两个结果:

  1. 切换网络手机热点,pnpm dlx nuxi init my-app 命令可以创建项目成功。
  2. 除了 pnpm dlx nuxi init my-app 这个方法在热点网络可以创建成功外, npx nuxi init my-app npx的命令都一样不能创建。

如果有知道问题的大佬可以帮忙解惑下,感谢!

项目目录及配置整理

目录
|src  
|--assets           静态文件
|--components       组件  
|--composables      公用方法
|--constants        常量数据
|--layouts          布局组件
|--middleware       中间件
|--pages            页面文件
|--public           静态文件
|--store            状态管理
|--types            类型
|--utils            公用方法
|app.vue            入口文件

注意:nuxt 会把 /pages目录下的文件自动生成路由。

nuxt.config.ts 配置
import { appDescription } from './src/constants/index'
export default defineNuxtConfig({
  srcDir: 'src', // 项目文件的根目录配置
  devServer: {
    host: '0.0.0.0', // 项目运行的ip
    port: 3256 // 项目运行的端口号
  },
  modules: [
    '@unocss/nuxt',
    '@vueuse/nuxt',
    '@nuxtjs/color-mode'
  ],
  colorMode: {
    classSuffix: '', // 显示模式,白天黑夜切换的class后缀清除dark,如果不设置,class为dark-mode
  },
  app: {
    head: {
      viewport: 'width=device-width,initial-scale=1',
      link: [
        { rel: 'icon', href: '/favicon.ico', sizes: 'any' },
        { rel: 'icon', type: 'image/svg+xml', href: '/nuxt.svg' },
        { rel: 'apple-touch-icon', href: '/apple-touch-icon.png' },
      ],
      meta: [
        { name: 'viewport', content: 'width=device-width, initial-scale=1' },
        { name: 'description', content: appDescription },
        { name: 'apple-mobile-web-app-status-bar-style', content: 'black-translucent' },
      ],
    },
  }
})

unocss 的配置文件 unocss.config.ts,使用就是在标签上直接使用 <div flex justify-center items-center text-sm>

import {
  defineConfig,
  presetAttributify,
  presetIcons,
  presetTypography,
  presetUno,
  presetWebFonts,
  transformerDirectives,
  transformerVariantGroup,
} from 'unocss'

export default defineConfig({
  shortcuts: [
    ['btn', 'px-4 py-1 rounded inline-block bg-teal-600 text-white cursor-pointer hover:bg-teal-700 disabled:cursor-default disabled:bg-gray-600 disabled:opacity-50'],
    ['icon-btn', 'inline-block cursor-pointer select-none opacity-75 transition duration-200 ease-in-out hover:opacity-100 hover:text-teal-600'],
  ],
  presets: [
    presetUno(),
    presetAttributify(),
    presetIcons({
      scale: 1.2,
    }),
    presetTypography(),
    presetWebFonts({
      fonts: {
        sans: 'DM Sans',
        serif: 'DM Serif Display',
        mono: 'DM Mono',
      },
    }),
  ],
  transformers: [
    transformerDirectives(),
    transformerVariantGroup(),
  ],
})
项目文件修改配置

项目初始化的 app.vue 文件需要修改,添加 <NuxtPage/> 组件,以便路由使用。

/layouts 目录下的布局组件使用。默认使用 default.vue文件。 还可以通过 页面的配置,改变当前页面的 布局组件使用。

definePageMeta({
  layout: "custom",
});

or

<template>
    <NuxtLayout :name="layout">
        <NuxtPage />
    </NuxtLayout>
</template>
<script setup>
// You might choose this based on an API call or logged-in status
const layout = "custom";
</script>
打包|命令
"build": "nuxt build",         // 打包 ssr
"dev": "nuxt dev",             // 本地开发运行
"generate": "nuxt generate",   // 打包静态页面

yarn build 打包
yarn generate 静态页面打包

pm2 部署

安装 pm2 (在服务器上安装)

npm install pm2 -g

项目根目录新建文件 ecosystem.config.js

module.exports = {
    apps: [
        {
            name: 'app-name', // 应用名称
            port: '3060', // 端口号
            exec_mode: 'fork', // cluster 集群模式,如不指定,默认为fork
            instances: '1', // 集群实例数,fork 模式
            script: './.output/server/index.mjs' // 执行的脚本路径
        }
    ]
}

运行 重启 停止 删除

pm2 [start|restart|stop|delete] ecosystem.config.js

查看运行列表 pm2 l

ending~

到此整个项目的迭代框架的第一步前端部分完成。细节的完善,更深入的学习,后面的路慢慢走。