javascript Vite:resolve.alias -如何解析路径?

voj3qocg  于 2023-06-20  发布在  Java
关注(0)|答案(5)|浏览(110)

有什么可以解决. alias的吗?它不会解析下面的路径:

// vite.config.js
import { defineConfig } from 'vite'
import path from 'path'

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

在我的HTML中:

<img src="@/assets/images/sample-1.jpg">

浏览器控制台出错:

GET http://localhost:3000/@/assets/images/sample-1.jpg 
Failed to load resource: the server responded with a status of 404 (Not Found)
client:180 [vite] connecting...
client:202 [vite] connected.

有什么办法可以正确地做吗?

h79rfbju

h79rfbju1#

npm install @rollup/plugin-alias --save-dev

yarn add -D @rollup/plugin-alias

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import alias from '@rollup/plugin-alias'
import { resolve } from 'path'

const projectRootDir = resolve(__dirname);

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [
    vue(),
    alias({
      entries: [
        {
          find: '@',
          replacement: resolve(projectRootDir, 'src')
        }
      ]
    })
  ],
  server: {
    host: '0.0.0.0',
    port: 10086, 
    open: false,
    cors: true, 
  },
  build: {
    outDir: 'dist',
  }
})

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import alias from '@rollup/plugin-alias'
import { resolve } from 'path'

const projectRootDir = resolve(__dirname);

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [
    alias(),
    vue()
  ],
  resolve: {
    alias: {
      "@": resolve(projectRootDir, "src"),
    },
  },
  server: {
    host: '0.0.0.0',
    port: 10086,
    open: false, 
    cors: true, 
  },
  build: {
    outDir: 'dist',
  }
})
72qzrwbm

72qzrwbm2#

看起来不需要额外的插件(vite 3.1.0),配置vite.config.js

import { defineConfig } from 'vite';
import * as path from 'path';

export default defineConfig({
...
    resolve: {
        alias: [
            { find: '@', replacement: path.resolve(__dirname, 'src') },
        ],
    },
...
});

tsconfig.json

{
  "compilerOptions": {
...
    "baseUrl": ".",
    "paths": {
      "@/*": ["./src/*"],
    },
...
  },
...
}

也别忘了linting,eslint也应该知道别名。只需安装eslint插件eslint-import-resolver-alias并在eslint配置.eslintrc.js中定义它

module.exports = {
...
    settings: {
        'import/resolver': {
            node: {
                extensions: ['.js', '.vue', '.ts', '.d.ts'],
            },
            alias: {
                extensions: ['.vue', '.js', '.ts', '.scss', '.d.ts'],
                map: [
                    ['@/components', './src/components'],
                    ['@/pages', './src/pages'],
                    ['@/router', './src/router'],
                    ['@/store', './src/store'],
                    ['@/styles', './src/styles'],
                    ['@/types', './src/types'],
                    ['@/utils', './src/utils'],
                ],
            },
        },
    },
...
};

正如你所看到的,我为每个文件夹定义了别名,这是因为我对整个文件夹src的别名有问题,它对以@符号开始的包抛出错误-无法解决包,但目前的方法工作得很好。

cyej8jka

cyej8jka3#

对于2.7.12版本(我目前的版本),一个简单的解决方案是将alias声明为数组

import vue from '@vitejs/plugin-vue'
import { defineConfig } from 'vite'
import path from 'path'

export default defineConfig({
  plugins: [ vue() ],
  resolve: {
    alias: [
      { find: '@', replacement: path.resolve(__dirname, './src') },
      { find: '@config', replacement: path.resolve(__dirname, './src/config') },
      { find: '@plugins', replacement: path.resolve(__dirname, './src/plugins') },
      { find: '@views', replacement: path.resolve(__dirname, './src/views') },
      { find: '@mixins', replacement: path.resolve(__dirname, './src/mixins') },
      { find: '@svg', replacement: path.resolve(__dirname, './src/svg') },
      { find: '@models', replacement: path.resolve(__dirname, './src/models') },
      { find: '@components', replacement: path.resolve(__dirname, './src/components') },
    ]
  }
})

检查类型时可以看到法律的格式:

resolve?: ResolveOptions & {
  alias?: AliasOptions;
};

其中AliasOptions是别名的数组

export declare type AliasOptions = readonly Alias[] | { [find: string]: string }
qvtsj1bj

qvtsj1bj4#

您可以将它们声明为一个带有键和值的对象,而不是自己解析路径。
举个小例子:

import { defineConfig } from 'vite';

export default defineConfig({
  ..
  resolve: {
    alias: {
      '@components': '/src/components',
      '@hooks': '/src/hooks',
      '@util': '/src/util',
    },
  },
});
a2mppw5e

a2mppw5e5#

对于Vite版本>4,我做了两件事
首先解决vite.config.ts中的别名问题

resolve: {
alias: [
    { find: '@', replacement: path.resolve(__dirname, 'src') },
    { find: '@auth', replacement: path.resolve(__dirname, './src/auth') },
],

第二,在tsconfig.json中添加路径

"baseUrl": "src",
  "paths": {
  "@layout/*": ["layout/*"],
  "@lib/*": ["lib/*"],
  "@auth/*": ["auth/*"],
},

相关问题