【问题标题】:Vite import CSS with alias in main.tsVite 在 main.ts 中使用别名导入 CSS
【发布时间】:2021-02-06 16:29:28
【问题描述】:

我正在尝试用 vite 替换 vue-cli。我有一个 vite.config.js,所以我可以使用别名进行导入:

export default {
    alias: {
        '@': require('path').resolve(__dirname, 'src'),
    },
};

然后在我的 main.ts 中,我尝试导入我的 css 文件(我尝试使用或不使用 .module

import { createApp } from 'vue';
import App from './App.vue';
import router from './router';

import '@/assets/app.module.css';

createApp(App).use(router).mount('#app');

但我收到此错误:

[vite] 无法解析模块导入“@/assets/app.module.css”。 (由/src/main.ts导入)

我做错了什么?

【问题讨论】:

    标签: typescript vue.js vuejs3 vite


    【解决方案1】:

    截至vite@2.1.5,我可以通过以下方式解决@~ 别名:

    • 添加vite-aliases

    • 按照readme.md中的描述修改vite.config.js

    • 使用 ~ 别名为引用的 scss 文件添加别名,如下所示:

      aliases.push({ find: '~bootstrap', replacement: 'bootstrap' })
      

    现在vite.config.js 如下所示:

    import { defineConfig } from 'vite'
    import vue from '@vitejs/plugin-vue'
    import { getAliases } from 'vite-aliases'
    
    const aliases = getAliases();
    
    // add aliases to import scss from node_modules here
    
    aliases.push({ find: '~bootstrap', replacement: 'bootstrap' })
    
    // https://vitejs.dev/config/
    
    export default defineConfig({
      plugins: [vue()],
      resolve: {
        alias: aliases
      },
      css: {
        preprocessorOptions: {
          scss: {
            additionalData: '@import "@scss/shared.scss";'
          }
        }
      }
    })
    

    这让我可以按如下方式导入 scss 文件:

    src/main.ts:

    import '@scss/main.scss'
    

    src/scss/main.scss:

    @import "~bootstrap/scss/bootstrap";
    

    显然,如果您需要从node_modules 的子目录中导入更多的scss 文件,则需要为aliases 添加更多的别名。省略用于导入 bootstrap.scss 的波浪号别名是可行的,但我的 IDE 无法识别它。添加css.preprocessorOptions.scss.additionalData 会导致shared.scss 被导入到每个vue SFC 中。

    【讨论】:

    • 只需使用resolve: { alias: { '~bootstrap': path.resolve(__dirname, 'node_modules/bootstrap') }} 即可,无需vite-aliases 插件。不过,为我指明了正确的方向,谢谢。不知道为什么,但 '~': path.resolve(__dirname, 'node_modules/') 不工作,出于某种原因,所以你必须为每个引用到 scss @import 的插件添加一个条目。
    【解决方案2】:

    测试

    只是想补充: 对于仍在查看此答案的任何人,您需要添加解决方法,以便它工作,如网站中所述。 我没有添加斜杠'/@/' 这对我有用:

    示例:

    resolve: {
        alias: {
          '@': require('path').resolve(__dirname, 'src')
        }
      },
    

    https://vitejs.dev/config/#resolve-alias

    【讨论】:

    • 我认为现在 Vite 2 也是如此
    • 是的,这行得通。这应该是现在公认的答案。
    【解决方案3】:

    @Boussadjra Brahim 回答了最初的问题,我只想为其他对 VSCode 和 vite 设置有问题的人添加一些见解。这是我的简约 tsconfig.json

    {
        "compilerOptions": {
            "baseUrl": ".",
            "esModuleInterop": true,
            "moduleResolution": "node",
            "paths": {
                "@/*": [
                    "src/*"
                ]
            },
            "target": "esnext"
        },
        "include": [
            "src/**/*.ts",
        ]
    }
    
    • esModuleInterop:我需要它才能import seedrandom from 'seedrandom';
    • moduleResolution: 需要从vue 导入
    • 路径:不需要用/@/ 导入所有内容,而只需@/
    • 目标:需要在我的模型中包含 getter 和 setter (get x, set x)

    【讨论】:

      【解决方案4】:

      根据those code lines

      别名到 fs 目录的路径
      键必须以斜杠开头和结尾
      '/@foo/': path.resolve(__dirname, 'some-special-dir')

      所以试试吧:

       '/@/': require('path').resolve(__dirname, 'src'),
      

      【讨论】:

      • 是的,似乎是这样。我现在可以使用 @/assets/app.css 导入 css,但似乎我现在需要使用 /@/components/ 导入我的 TS 和 .vue 文件,否则 VSCode 会报错。
      • 你的意思是你必须把每一个相对路径都改成@/绝对路径吗?
      • 我认为这不是 vite 问题,而是 VSCode 问题。毕竟我需要添加一个最小的 tsconfig.json 让它再次快乐
      猜你喜欢
      • 2021-05-30
      • 1970-01-01
      • 2022-08-15
      • 2019-03-24
      • 2022-10-23
      • 2021-03-17
      • 1970-01-01
      • 1970-01-01
      • 2018-01-23
      相关资源
      最近更新 更多