Node.js 路径处理和 Vite 配置详解

1. process.cwd()

process.cwd() 返回 Node.js 进程的当前工作目录的绝对路径。


// 获取当前工作目录

const root = process.cwd()

// 例如:在 /Users/project/my-app 目录下运行命令

console.log(process.cwd())  // 输出: /Users/project/my-app

与 dirname 的区别- process.cwd(): 返回运行 node 命令时所在的目录- __dirname: 返回源代码中当前文件所在的目录

2. path.resolve()path.resolve() 方法将路径或路径片段解析为绝对路径。

基本用法

import { resolve } from 'path'

// 基础示例
resolve('src')  // /Users/project/my-app/src

// 多段路径
resolve('src', 'components', 'Button.vue')  
// /Users/project/my-app/src/components/Button.vue

路径解析规则

// 1. 从右向左处理,遇到绝对路径会重置
resolve('/foo', '/bar', 'baz')     // '/bar/baz'

// 2. 相对路径会追加
resolve('foo', 'bar', 'baz')       // '/当前目录/foo/bar/baz'

// 3. 处理 . 和 ..
resolve('foo', '../bar', './baz')  // '/当前目录/bar/baz'

3. Vite 配置详解### 基础配置

import { defineConfig } from 'vite'
import { resolve } from 'path'

const root = process.cwd()

export default defineConfig({
  // 基础公共路径
  base: '/',
  
  // 项目根目录
  root: root,
  
  // 开发服务器选项
  server: {
    host: true,
    port: 3000,
    open: true,
    cors: true,
    proxy: {
      '/api': {
        target: 'http://localhost:8080',
        changeOrigin: true,
        rewrite: (path) => path.replace(/^\/api/, '')
      }
    }
  }
})

构建选项

export default defineConfig({
  build: {
    // 输出目录
    outDir: 'dist',
    
    // 生成源码映射
    sourcemap: true,
    
    // 压缩选项
    minify: 'terser',
    terserOptions: {
      compress: {
        drop_console: true,
        drop_debugger: true
      }
    },
    
    // 分块策略
    rollupOptions: {
      output: {
        manualChunks: {
          'vendor': ['vue', 'vue-router', 'pinia'],
          'echarts': ['echarts']
        }
      }
    }
  }
})

解析选项

export default defineConfig({
  resolve: {
    // 别名配置
    alias: [
      {
        find: '@',
        replacement: resolve(root, 'src')
      },
      {
        find: '@components',
        replacement: resolve(root, 'src/components')
      }
    ],
    
    // 导入时想要省略的扩展名列表
    extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json']
  }
})

CSS 配置

export default defineConfig({
  css: {
    // CSS 预处理器配置
    preprocessorOptions: {
      scss: {
        additionalData: '@import "@/styles/variables.scss";',
        javascriptEnabled: true
      }
    },
    
    // CSS modules 配置
    modules: {
      scopeBehaviour: 'local',
      generateScopedName: '[name]_[local]_[hash:base64:5]'
    }
  }
})

优化选项

export default defineConfig({
  optimizeDeps: {
    // 预构建依赖项
    include: [
      'vue',
      'vue-router',
      'pinia',
      'axios',
      'lodash-es'
    ],
    // 排除预构建的依赖项
    exclude: ['your-package-name']
  }
})

环境变量配置

// .env.development
VITE_API_URL=http://dev-api.example.com
VITE_APP_TITLE=开发环境

// vite.config.ts
export default defineConfig(({ command, mode }) => {
  const env = loadEnv(mode, process.cwd())
  
  return {
    define: {
      'process.env': env
    }
  }
})

4. 最佳实践

路径处理

function pathResolve(dir: string) {
  return resolve(process.cwd(), '.', dir)
}

// 使用
const config = {
  alias: {
    '@': pathResolve('src'),
    '@components': pathResolve('src/components')
  }
}

环境区分

export default defineConfig(({ command, mode }) => {
  const isBuild = command === 'build'
  const env = loadEnv(mode, process.cwd())
  
  return {
    base: env.VITE_BASE_PATH,
    server: {
      port: env.VITE_PORT
    },
    build: {
      minify: isBuild ? 'terser' : false
    }
  }
})

这些配置可以根据项目需求进行调整和组合,创建最适合你项目的构建配置。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。