Skip to content

Nuxt3 使用适配

Nuxt3 使用 normalize.css

安装

bash
pnpm install normalize.css -S

配置

bash
export default defineNuxtConfig({
    compatibilityDate: "2025-01-07",
    devtools: { enabled: true },
    css: ["normalize.css/normalize.css"],
})

Nuxt3 使用 postcss-pxtorem 和 amfe-flexible

安装

bash

pnpm install amfe-flexible  -S

pnpm install postcss-pxtorem -S

写插件

  • 根目录新建 plugins\rem\flexible.js 文件
js
import { defineNuxtPlugin } from "#app";

export default defineNuxtPlugin(() => {
  if (process.client) {
    (function flexible(window, document) {
      const docEl = document.documentElement;
      const dpr = window.devicePixelRatio || 1;

      // adjust body font size
      function setBodyFontSize() {
        if (document.body) document.body.style.fontSize = `${12 * dpr}px`;
        else document.addEventListener("DOMContentLoaded", setBodyFontSize);
      }
      setBodyFontSize();

      // set 1rem = viewWidth / 10
      function setRemUnit() {
        const rem = docEl.clientWidth / 10;
        docEl.style.fontSize = `${rem}px`;
      }

      setRemUnit();

      // reset rem unit on page resize
      window.addEventListener("resize", setRemUnit);
      window.addEventListener("pageshow", (e) => {
        if (e.persisted) setRemUnit();
      });

      // detect 0.5px supports
      if (dpr >= 2) {
        const fakeBody = document.createElement("body");
        const testElement = document.createElement("div");
        testElement.style.border = ".5px solid transparent";
        fakeBody.appendChild(testElement);
        docEl.appendChild(fakeBody);
        if (testElement.offsetHeight === 1) docEl.classList.add("hairlines");

        docEl.removeChild(fakeBody);
      }
    })(window, document);
  }
});

挂载插件

  • (1) 在 nuxt.config.ts 中挂载插件

  • (2) 修改 app 属性中的 head

  • (3) postcss 里面配置 postcss-pxtorem

js
import postCssPxToRem from "postcss-pxtorem";
export default defineNuxtConfig({
  compatibilityDate: "2025-01-07",
  devtools: { enabled: true },
  css: ["normalize.css/normalize.css"],
  // 使用scss
  vite: {
    css: {
      preprocessorOptions: {
        scss: {
          additionalData: '@use "~/assets/scss/base.scss" as *;',
        },
      },
      postcss: {
        plugins: [
          postCssPxToRem({
            rootValue: 75, // UI设计稿的宽度/10
            unitPrecision: 3, // 转rem精确到小数点多少位
            propList: ["*"], // 需要转换的属性 *表示所有
            selectorBlackList: ["ignore"], // 不进行px转换的选择器
            replace: true, // 是否直接更换属性值,而不添加备用属性
            mediaQuery: false, // 是否在媒体查询的css代码中也进行转换
            minPixelValue: 0, // 设置要替换的最小像素值
            exclude: /node_modules/i, // 排除node_modules文件夹下的文件
          }),
        ],
      },
    },
  },
  // 测试环境读取
  runtimeConfig: {
    // 仅仅在服务端
    baseUrl: process.env.VITE_BASE_URL,
    // 客户端也读取
    public: {
      baseUrl: process.env.VITE_BASE_URL,
    },
  },
  // 这里是方便生产环境读取
  appConfig: {
    mode: process.env.VITE_MODE,
    baseUrl: process.env.VITE_BASE_URL,
  },
  // SEO配置
  app: {
    head: {
      title: "Nuxt3",
      meta: [
        { name: "description", content: "Nuxt3" },
        { name: "keywords", content: "Nuxt3" },
        {
          name: "viewport",
          content:
            "width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=0",
        },
      ],
      link: [
        {
          rel: "stylesheet",
          href: "https://cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css",
        },
      ],
      script: [
        {
          src: "https://cdnjs.cloudflare.com/ajax/libs/pace/1.2.4/pace.min.js",
        },
      ],
    },
  },
  // 安装插件
  plugins: ["~/plugins/rem/flexible.ts"],
});