当前位置: 首页 > article >正文

详细分析 npm run build 基本知识 | 不同环境不同命令

目录

  • 前言
  • 1. 基本知识
  • 2. 构建逻辑

前言

关于部署服务器的知识推荐阅读:npm run build部署到云服务器中的Nginx(图文配置)

1. 基本知识

npm run 是 npm 的一个命令,用于运行 package.json 中定义的脚本,可以通过 “scripts” 字段为项目定义各种任务

"scripts": {
  "build:dev": "node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build --mode local-dev",
  "build:prod": "node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build --mode prod"
}

当执行 npm run build:dev,npm 会找到 build:dev并执行定义的命令

build:xxx 脚本通过 --mode 参数指定不同的环境模式,如 local-dev、prod 等

结合 Vite 的 .env 文件机制,不同模式下可以加载不同的环境配置:

  • .env:默认通用配置
  • .env.dev:开发环境
  • .env.prod:生产环境

截图如下:

在这里插入图片描述

以及上述参数中 --max_old_space_size=8192 用于设置 Node.js 的最大内存分配(单位:MB),解决构建大型项目时可能出现的内存不足问题

基本的配置如下:

在这里插入图片描述

对于其更详细的配置文件可看:深入理解 package.json的配置文件

补充一个vite的基本知识:

  • 快速构建:基于 Rollup 打包
  • 支持 Tree Shaking 和代码分割,优化资源体积
  • 支持现代浏览器的原生 ES 模块

使用 pnpm 安装依赖
“i”: “pnpm install”:比传统 npm install 快速且节省磁盘空间

2. 构建逻辑

具体构建资源路径在 vite.config.js 中,base 配置用于控制资源路径

import { resolve } from 'path'
import { loadEnv } from 'vite'
import type { UserConfig, ConfigEnv } from 'vite'
import { createVitePlugins } from './build/vite'
import { include, exclude } from "./build/vite/optimize"
// 当前执行node命令时文件夹的地址(工作目录)
const root = process.cwd()

// 路径查找函数,用于解析项目的根目录路径
function pathResolve(dir: string) {
  return resolve(root, '.', dir)
}

// 导出 Vite 配置
// https://vitejs.dev/config/
export default ({ command, mode }: ConfigEnv): UserConfig => {
  let env = {} as any // 存储环境变量
  const isBuild = command === 'build' // 判断当前是否是构建模式

  // 根据开发环境或构建模式加载不同的环境变量
  if (!isBuild) {
    // 开发模式下加载环境变量
    env = loadEnv(
      process.argv[3] === '--mode' ? process.argv[4] : process.argv[3],
      root
    )
  } else {
    // 构建模式下加载环境变量
    env = loadEnv(mode, root)
  }

  return {
    // 配置基础路径,用于静态资源的路径解析
    base: env.VITE_BASE_PATH, // 环境变量 `VITE_BASE_PATH` 决定基础路径
    root: root, // 项目根目录

    // 本地开发服务器的配置
    server: {
      port: env.VITE_PORT, // 开发服务器端口
      host: '0.0.0.0', // 监听所有 IP
      open: env.VITE_OPEN === 'true', // 是否自动打开浏览器
    },

    // 插件配置(提取到独立文件中管理)
    plugins: createVitePlugins(),

    // CSS 预处理器配置
    css: {
      preprocessorOptions: {
        scss: {
          additionalData: '@import "./src/styles/variables.scss";', // 引入全局样式变量
          javascriptEnabled: true, // 启用 JavaScript 支持
        },
      },
    },

    // 路径解析设置
    resolve: {
      extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.scss', '.css'], // 允许的扩展名
      alias: [
        {
          find: 'vue-i18n', // 使用别名替换 i18n 包路径
          replacement: 'vue-i18n/dist/vue-i18n.cjs.js',
        },
        {
          find: /\@\//, // 将 `@` 解析为 src 目录
          replacement: `${pathResolve('src')}/`,
        },
      ],
    },

    // 构建配置
    build: {
      minify: 'terser', // 使用 terser 压缩代码
      outDir: env.VITE_OUT_DIR || 'dist', // 输出目录,默认为 `dist`
      sourcemap: env.VITE_SOURCEMAP === 'true' ? 'inline' : false, // 是否生成 SourceMap
      terserOptions: {
        compress: {
          drop_debugger: env.VITE_DROP_DEBUGGER === 'true', // 是否移除调试器
          drop_console: env.VITE_DROP_CONSOLE === 'true', // 是否移除 console.log
        },
      },
    },
    // 依赖优化配置
    optimizeDeps: { include, exclude },
  }
}

http://www.kler.cn/a/415150.html

相关文章:

  • 安能物流 All in TiDB 背后的故事与成果
  • 简单好用的折线图绘制!
  • 利用zabbix自定义脚本监控MySQL基础状态
  • kafka消费者组和分区数之间的关系是怎样的?
  • vue3实现自定义导航菜单
  • 七牛云AIGC内容安全方案助力企业合规创新
  • 数据库期末复习题库
  • Vue3组件异步懒加载defineAsyncComponent
  • 选择使用whisper.cpp进行语音转文字
  • SpringBoot连接测试InfluxDB时序数据库
  • 学习ASP.NET Core的身份认证(基于Session的身份认证1)
  • 使用命令行创建一个简单的 Maven Web 应用程序
  • MindAgent部署(进行中.....)
  • 23种设计模式-工厂方法(Factory Method)设计模式
  • sqli_labs-10,11,12 --详细解析
  • 叮!您的RK3568系统镜像备份方法请查收
  • 可视化建模以及UML期末复习篇----相关软件安装
  • web博客系统的自动化测试
  • MEASURING INTANGIBLE CAPITAL WITH MARKET PRICES论文阅读
  • MySQL面试攻略:从基础到高级,全面解析
  • 【微服务】Nacos配置管理
  • docker-mysql
  • 分布式光伏与储能协调控制策略的应用分析
  • 简单线性DP
  • 通过docker overlay2 目录名查找容器名和容器ID
  • 架构第十一章:zabbix