Vue3.5 + Vite6.x 项目的完整 Stylelint 配置方案,支持 .vue/.html 内联样式、Less/SCSS/CSS 等多种文件类

Vue3.5 + Vite6.x 项目的完整 Stylelint 配置方案,支持 .vue/.html 内联样式、Less/SCSS/CSS 等多种文件类型

一、完整依赖安装

npm install --save-dev 
  stylelint 
  stylelint-config-standard 
  postcss-html           # 解析 Vue/HTML 文件中的样式
  postcss-scss           # 解析 SCSS 语法
  postcss-less           # 解析 LESS 语法
  stylelint-config-recommended-vue   # Vue 文件支持
  stylelint-less          # LESS 专属规则
  stylelint-scss          # SCSS 专属规则
  stylelint-no-unresolved-module  # 路径解析

二、完整配置文件 .stylelintrc.json

{
  "extends": [
    "stylelint-config-standard",
    "stylelint-config-recommended-vue",
    "stylelint-less",
    "stylelint-scss"
  ],
  "plugins": ["stylelint-no-unresolved-module"],
  "overrides": [
    {
      "files": ["**/*.vue", "**/*.html"],
      "customSyntax": "postcss-html"
    },
    {
      "files": ["**/*.scss"],
      "customSyntax": "postcss-scss"
    },
    {
      "files": ["**/*.less"],
      "customSyntax": "postcss-less"
    }
  ],
  "rules": {
    // 通用规则
    "selector-pseudo-class-no-unknown": [
      true,
      { "ignorePseudoClasses": ["deep", "global", "slotted"] }
    ],
    "selector-pseudo-element-no-unknown": [
      true,
      { "ignorePseudoElements": ["v-deep", "v-global", "v-slotted"] }
    ],
    "at-rule-no-unknown": [
      true,
      { "ignoreAtRules": ["tailwind", "apply", "layer", "config", "mixin", "include"] }
    ],

    // LESS 专属规则
    "less/no-undef-variables": true,
    "less/color-no-invalid-hex": true,

    // SCSS 专属规则
    "scss/at-rule-no-unknown": [
      true,
      { "ignoreAtRules": ["tailwind", "apply", "layer", "config", "mixin", "include"] }
    ],

    // 路径解析规则
    "plugin/no-unresolved-module": {
      "alias": {
        "@": "./src"
      }
    }
  }
}

三、配套文件配置

  1. package.json 脚本
"scripts": {
  "stylelint": "stylelint src/**/*.{html,vue,css,scss,less}",
  "stylelint:fix": "stylelint --fix src/**/*.{html,vue,css,scss,less}"
}
  1. 忽略文件 .stylelintignore
# .stylelintignore
# 旧的不需打包的样式库
*.min.css
 
# 其他类型文件
*.js
*.jpg
*.png
*.eot
*.ttf
*.woff
*.json
 
# 测试和打包目录
/test/
/dist/
/node_modules/
/lib/

  1. Vite 集成配置 (vite.config.js)
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import stylelintPlugin from 'vite-plugin-stylelint'

export default defineConfig({
  plugins: [
    vue(),
    stylelintPlugin({
      fix: true,
      include: ['src/**/*.{vue,css,scss,less,html}'],
      exclude: ['node_modules']
    })
  ]
})

四、

1、SCSS @use 语法报错

{
  "rules": {
    "scss/at-rule-no-unknown": [
      true,
      { "ignoreAtRules": ["use", "forward"] }
    ]
  }
}

2、Vue3 :deep() 伪类警告

{
  "rules": {
    "selector-pseudo-class-no-unknown": [
      true,
      { "ignorePseudoClasses": ["deep", "slotted", "global"] }
    ]
  }
}

3、解析 .vue 文件中的

{
  "overrides": [
    {
      "files": ["**/*.vue"],
      "customSyntax": "postcss-html"  // 关键配置
    }
  ]
}

4、变量未识别(以 LESS 为例)

{
  "rules": {
    "less/no-undef-variables": true  // 检查未定义变量
  }
}

5、@import 路径报错

{
  "plugins": ["stylelint-no-unresolved-module"],
  "rules": {
    "plugin/no-unresolved-module": {
      "alias": {
        "@": "./src"  // 配置路径别名
      }
    }
  }
}
<think>好的,我现在需要帮助用户在Vue项目中实现将Markdown内容转换为PDF的功能。首先,我得仔细分析用户的需求。用户提到了他们之前遇到的引用问题,比如变量注入和路由跳转错误,这可能意味着他们在配置或依赖管理上有过问题,需要特别注意解决方案的兼容性和配置步骤的准确性。 接下来,我应该考虑Vue项目中常用的Markdown转PDF的方法。通常,这类需求可以通过前端库或后端服务来实现。但用户可能更倾向于前端解决方案,以减少服务器依赖。首先,我会想到使用现有的JavaScript库,比如`markdown-it`配合`html2pdf.js`或者`jsPDF`。另外,可能需要样式处理,特别是用户之前有SCSS变量注入的经验,所以在转换过程中确保样式正确应用也很重要。 然后,我需要验证这些库的可行性和兼容性。例如,`markdown-it`是一个流行的Markdown解析器,可以将Markdown转换为HTML,接着用`html2pdf.js`将HTML转为PDF。但需要注意,CSS样式可能需要内联或通过配置正确加载,否则生成的PDF可能样式丢失。此外,用户提到的Vite项目配置中注入了SCSS变量,可能需要确保这些变量在生成PDF时也被正确应用,可能需要检查构建工具的相关配置是否会影响转换过程。 另一个方案是使用`vuepress-plugin-export`,这是VuePress的插件,专为导出PDF设计。但用户的项目可能不是基于VuePress的,所以需要确认该插件是否适用于普通Vue项目。如果不行,可能需要寻找其他替代方案。 还有可能需要后端协助,比如调用Node.js的库`markdown-pdf`,但这会增加服务器的负担,如果用户希望纯前端实现,这可能不是最佳选择。不过,如果用户接受后端处理,这也是一个可靠的方法。 接下来,我需要考虑用户可能遇到的问题,比如中文字体支持。很多PDF生成库默认不支持中文,导致乱码,因此需要确保在生成PDF时嵌入中文字体,或者配置相关选项。例如,使用`jsPDF`时可能需要添加字体文件,并在生成时指定字体。 此外,用户之前遇到的错误`Cannot read properties of null`可能涉及到DOM操作的问题,如果在PDF生成过程中需要操作DOM元素,必须确保在正确的生命周期钩子中执行,比如在`mounted`之后,或者使用虚拟DOM的方法。同时,异步加载内容的问题也需要考虑,可能需要等待数据加载完成后再进行转换。 最后,总结可行的方案,分步骤说明,并给出代码示例,同时提醒可能遇到的坑和解决方法,比如样式注入、字体配置、异步处理等。需要确保推荐的方法与用户的Vite项目配置兼容,特别是SCSS变量的注入,可能需要检查生成的HTML是否正确包含样式。</think>在Vue项目中实现Markdown转PDF功能,可通过以下三种主流方案实现: ### 一、前端渲染方案(推荐) 使用`markdown-it` + `html2pdf.js`组合: ```bash npm install markdown-it html2pdf.js ``` 组件实现: ```vue <script setup> import markdownIt from &#39;markdown-it&#39; import html2pdf from &#39;html2pdf.js&#39; const md = new markdownIt() const content = &#39;# Hello PDF \n 这是一个Vue生成的PDF文件&#39; const exportPDF = () => { const html = md.render(content) const element = document.createElement(&#39;div&#39;) element.innerHTML = html html2pdf().from(element).set({ margin: 10, filename: &#39;document.pdf&#39;, image: { type: &#39;jpeg&#39;, quality: 0.98 }, html2canvas: { scale: 2 }, jsPDF: { unit: &#39;mm&#39;, format: &#39;a4&#39;, orientation: &#39;portrait&#39; } }).save() } </script> <template> <button @click="exportPDF">导出PDF</button> </template> ``` ### 二、专用插件方案 使用`vuepress-plugin-export`(适用于VuePress项目): ```bash npm install vuepress-plugin-export -D ``` 在`.vuepress/config.js`中配置: ```javascript module.exports = { plugins: [ [&#39;export&#39;, { pdf: true, pdfOptions: { format: &#39;A4&#39;, printBackground: true } }] ] } ``` ### 三、服务端生成方案 使用Node.js的`markdown-pdf`: ```bash npm install markdown-pdf ``` API接口示例: ```javascript // server.js const markdownpdf = require("markdown-pdf") app.post(&#39;/generate-pdf&#39;, (req, res) => { markdownpdf() .from.string(req.body.markdown) .to.buffer((err, buffer) => { res.setHeader(&#39;Content-Type&#39;, &#39;application/pdf&#39;) res.send(buffer) }) }) ``` ### 关键问题解决方案 1. **样式注入**:在vite.config.js中确保SCSS变量注入[^1] ```javascript // vite.config.js css: { preprocessorOptions: { scss: { additionalData: `@import "@/styles/pdf.scss";` } } } ``` 2. **中文支持**:在PDF生成配置中添加字体 ```javascript html2pdf().set({ //... jsPDF: { font: &#39;simhei&#39;, url: &#39;/fonts/simhei.ttf&#39; } }) ``` 3. **异步内容处理**:使用Suspense组件确保数据加载完成 ```vue <Suspense> <template #default> <PreviewComponent /> </template> <template #fallback> Loading... </template> </Suspense> ``` ### 方案对比 | 方案 | 优点 | 缺点 | |-----------|---------------------|---------------------| | 前端方案 | 零服务端依赖 | 复杂格式支持有限 | | VuePress插件 | 开箱即用 | 仅限VuePress项目 | | 服务端方案 | 支持复杂排版 | 需要维护Node服务 | 建议优先采用前端方案,若需要更专业的排版效果可结合服务端方案。注意处理DOM操作时的null异常问题[^2],建议在`onMounted`生命周期后执行PDF生成操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值