🚀 Socket Launch Week Day 5:Introducing Repository Access Permissions and Custom Roles.Learn more
Sign In

@heisea/navim

Package Overview
Dependencies
Maintainers
3
Versions
75
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@heisea/navim

面向 `single-spa + Vue 2` 场景的前端打包工具库。当前实现已经统一到三套引擎:

latest
npmnpm
Version
1.2.3
Version published
Weekly downloads
1.3K
3893.75%
Maintainers
3
Weekly downloads
 
Created
Source

Navim

面向 single-spa + Vue 2 场景的前端打包工具库。当前实现已经统一到三套引擎:

  • webpack
  • vite
  • rsbuild

文档按当前仓库实现编写,重点说明可用命令、配置 schema、引擎差异和兼容行为。本文中把体积分析能力统一称为 analyze,当前 CLI 命令名仍保留为 analyzer,用于兼容既有项目。

适用范围

  • Node.js >= 20.0.0
  • 仓库维护和 CI 基线统一使用 pnpm 9.15.9
  • Vue 2 项目
  • 微前端场景,尤其是 single-spa
  • 项目根目录通过 navim.config.js 驱动 Navim

安装

推荐把 @heisea/navim 安装到项目依赖中,再通过 npm scripts 或 npx 调用。

pnpm add -D @heisea/navim

或:

npm install -D @heisea/navim

快速开始

{
  "scripts": {
    "dev": "navim-service dev --engine webpack",
    "dev:vite": "navim-service dev --engine vite",
    "dev:rsbuild": "navim-service dev --engine rsbuild",
    "build": "navim-service build --engine webpack",
    "build:vite": "navim-service build --engine vite",
    "build:rsbuild": "navim-service build --engine rsbuild",
    "analyze": "navim-service analyzer --engine webpack",
    "inspect": "navim-service inspect --engine webpack",
    "single-spa:doctor": "navim-service single-spa doctor"
  }
}

目录约定

Navim 依赖一些固定文件位置,缺少这些文件时命令会直接失败。

your-project/
├── build/
│   └── config.js
├── public/
│   └── index.html
├── src/
│   ├── main.js
│   ├── styles/
│   │   └── variables.less
│   └── plugins/
├── .env
├── .env.local
├── .env.development
├── .env.production
└── navim.config.js

关键约定:

  • 根目录必须存在 navim.config.js
  • build/config.js 必须存在,哪怕只导出空对象
  • HTML 模板固定为 public/index.html
  • 默认 Less 全局变量入口为 src/styles/variables.less
  • 默认插件目录为 src/plugins

CLI 命令

统一入口

统一入口是以下四类命令:

navim-service dev --engine webpack|vite|rsbuild
navim-service build --engine webpack|vite|rsbuild
navim-service analyzer --engine webpack|rsbuild
navim-service inspect --engine webpack|vite|rsbuild

说明:

  • dev 默认引擎是 webpack
  • build 默认引擎是 webpack
  • analyzer 默认引擎是 webpack
  • inspect 默认引擎是 webpack
  • dev 固定按开发模式运行
  • build 只接受 productionpretest 三种环境值,默认 production
  • analyzer 语义上对应 analyze

dev

navim-service dev --engine webpack
navim-service dev --engine vite
navim-service dev --engine rsbuild
navim-service dev --engine webpack --micro
navim-service dev --engine webpack --mode sit

公共参数:

  • --engine <engine>webpackvitersbuild
  • --micro:微前端模式,主要影响 webpack 和 rsbuild 的 externals 策略
  • --mode <type>:额外读取 .env.<type>

build

navim-service build
navim-service build test
navim-service build pre
navim-service build production --mode sit
navim-service build --engine vite
navim-service build --engine rsbuild

行为说明:

  • 默认环境为 production
  • 合法环境值只有 productiontestpre
  • --mode <type> 会额外读取 .env.<type>
  • webpackvitersbuild 都支持构建

analyzer

navim-service analyzer
navim-service analyzer --engine webpack
navim-service analyzer --engine rsbuild

说明:

  • 当前 CLI 命令名仍然是 analyzer
  • 语义上对应统一的 analyze 能力
  • webpack 使用 webpack-bundle-analyzer
  • rsbuild 会启用 bundleAnalyze
  • vite 当前不支持分析命令

inspect

navim-service inspect
navim-service inspect --engine vite
navim-service inspect --engine rsbuild --env production
navim-service inspect --micro

用途:

  • 输出当前引擎翻译后的运行时配置
  • 适合排查 entryaliasproxyhtmloutputstyles 的最终值

兼容命令

以下旧命令仍然保留:

  • navim-service start 等价于 navim-service dev --engine webpack
  • navim-service vite start 等价于 navim-service dev --engine vite
  • navim-service single-spa doctor 仍然可用

build/config.js(代理配置)

build/config.js 是默认的代理配置文件,需导出代理表(路径 → 目标)。如果没有代理需求,也请至少导出空对象:

module.exports = {};

常见写法:

module.exports = {
  "/api": {
    target: "http://localhost:8080",
    changeOrigin: true,
  },
};

1.2.0 起,代理文件路径可通过 common.dev.proxy 自定义(默认仍为 ./build/config.js),三引擎(webpack/vite/rsbuild)通用。适用于代理表不在 build/config.js、或 build/config.js 已被业务代码占用的项目:

module.exports = {
  common: {
    dev: { proxy: "./build/proxy.dev.js" },
  },
};

navim.config.js

navim.config.js 是 Navim 的核心配置文件,支持对象形式和函数形式。当前实现同时兼容两种 schema:

  • legacy:顶层使用 webpackvitersbuild
  • current:顶层使用 common,再加上 webpackvitersbuild 作为引擎覆盖项

当前 schema 边界

  • vitersbuilddev / build / inspect 直接消费 common
  • webpackdev / build / analyzer 仍然走 legacy webpack 配置块
  • single-spa doctor 也仍然只面向 legacy webpack 配置块
  • 如果项目同时要跑 webpackvite / rsbuild,当前需要保留一份 legacy webpack 字段,并与 common 中的对应值保持同步
  • 只写 common 而不写 legacy webpack.entrywebpack.librarywebpack.publicPath,当前并不足以驱动 webpack 实际构建

函数形式

函数会收到两个参数:

  • NODE_ENV
  • extraInfo
    • 当前实现中包含 extraInfo.navim_hash
module.exports = (NODE_ENV, extraInfo) => {
  const entry = NODE_ENV === "development" ? "./src/main.dev.js" : "./src/main.js";
  const publicPath = NODE_ENV === "development" ? "//localhost:9000/" : "/demo/";

  return {
    common: {
      entry: {
        app: entry,
      },
      output: {
        outDir: "dist",
        publicPath,
        library: {
          name: "demo-app",
          format: "umd",
        },
      },
      dev: {
        host: "127.0.0.1",
        port: 9000,
        open: false,
        headers: {
          "Access-Control-Allow-Origin": "*",
        },
      },
      html: {
        template: "./public/index.html",
        rootElementId: "app",
      },
      resolve: {
        alias: {
          "@": "./src",
        },
      },
      styles: {
        extract: true,
        resources: ["./src/styles/variables.less"],
        less: {
          javascriptEnabled: true,
        },
      },
      assets: {
        copy: [],
      },
      define: {},
      externals: {
        dev: {
          react: "React",
          "react-dom": "ReactDOM",
        },
        micro: {
          vue: "Vue",
          "vue-router": "VueRouter",
          "element-ui": "ELEMENT",
        },
      },
      micro: {
        enabled: false,
        type: "single-spa",
        cssExtractDoctor: true,
      },
    },
    webpack: {
      // webpack 运行时当前仍然依赖这组 legacy 字段
      entry: {
        app: entry,
      },
      library: "demo-app",
      publicPath,
      isExtractCss: true,
      styleResourcesLoaderPatterns: ["./src/styles/variables.less"],
      extraPlugins: [],
      htmlWebpackPlugin: {},
      htmlWebpackTagsPlugin: {},
      copyWebpackPluginPatterns: [],
    },
    vite: {
      entry: "./src/main.js",
      rootElementId: "app",
      optimizeDeps: {
        include: ["@heisea/brick"],
        exclude: ["vue-router", "vuex"],
      },
      staticCopyTargets: [],
      plugins: [],
    },
    rsbuild: {
      plugins: [],
      tools: {},
      config: {},
    },
  };
};

旧 schema

如果你不想迁移,旧的顶层写法仍然可用。

module.exports = {
  webpack: {
    entry: {
      app: "./src/main.js",
    },
    library: "demo-app",
    publicPath: "/demo/",
  },
  vite: {
    entry: "./src/main.js",
    rootElementId: "app",
  },
  rsbuild: {
    plugins: [],
  },
};

common 配置

common 是推荐的 normalized 公共配置层,但当前只有一部分字段真正进入了运行时。

字段类型默认值说明
entryobject{}入口定义(构建入口)
output.outDirstringdist输出目录
output.publicPathstring资源前缀
output.library.namestringUMD 库名(webpack 引擎;rsbuild 引擎在 micro.enabled 时生效)
output.library.formatstringumd输出格式(webpack 引擎;rsbuild 引擎在 micro.enabled 时生效)
dev.hoststring127.0.0.1开发服务 host
dev.portnumber9000开发服务端口
dev.openbooleanfalse是否自动打开浏览器
dev.headersobjectCORS 头开发服务响应头
dev.proxystring./build/config.js代理配置文件路径(导出代理表);三引擎通用,自 1.2.0 起可自定义
dev.entryobject/stringdev 命令下的入口覆盖(不设则用 common.entry);三引擎通用,自 1.2.0 起支持
html.templatestring./public/index.htmlHTML 模板
html.rootElementIdstringapp根节点 id
html.tagsobject{}HTML tag 扩展数据
resolve.aliasobject内置别名路径别名
resolve.extensionsstring[]内置扩展解析扩展名
styles.extractbooleanfalse主要给 webpack 的 CSS 抽离开关
styles.resourcesstring[][]Less 全局注入文件
styles.less.javascriptEnabledbooleantrueLess loader 选项
assets.copyArray[]复制静态资源
defineobject{}常量注入
externals.devobjectreact / react-dom开发态 externals
externals.microobject微前端 externals微前端外部依赖
micro.enabledbooleanfalse微前端开关
micro.typestringsingle-spa微前端类型
micro.cssExtractDoctorbooleantrueCSS 抽离提示开关

当前生效范围

  • 已在 vitersbuild 运行时直接生效:entryoutput.publicPathoutput.outDirdev.hostdev.portdev.openhtml.templateresolve.aliasresolve.extensionsstyles.resourcesstyles.less.javascriptEnableddefine
  • 当前只在 vite 运行时直接生效:html.rootElementId
  • 当前只在 rsbuild 运行时直接生效:dev.headersassets.copyexternals.devexternals.micro
  • 1.1.0 起在 rsbuild 运行时生效:output.library.nameoutput.library.formatmicro.enabled(开启后产出 single-spa 微前端 UMD 产物:库名 + 入口 app.js + css/app.css 无 hash + 初始不分包)
  • 当前主要是 schema 预留、归一化输出或未来收敛位,不应当视为“已经全面支持”:html.tagsstyles.extract(rsbuild 生产构建默认抽离 CSS)、micro.typemicro.cssExtractDoctor

如果你当前仍然依赖 webpack 命令,请继续在 webpack 配置块里显式声明这些 legacy 字段:

  • entry
  • library
  • publicPath
  • isExtractCss
  • styleResourcesLoaderPatterns
  • copyWebpackPluginPatterns
  • htmlWebpackPlugin
  • htmlWebpackTagsPlugin
  • extraPlugins

默认别名

当前实现内置了这些别名:

  • @ -> ./src
  • ~@ -> ./src
  • /plugins -> ./src/plugins
  • images -> ./images
  • vue -> vue/dist/vue.esm.js
  • vue$ -> vue/dist/vue.common.js
  • ~element-ui -> ./node_modules/element-ui

默认扩展名

当前实现默认会解析:

.js .json .css .less .vue .mjs .mts .ts .jsx .tsx

webpack 配置

webpack 仍然是能力最完整的引擎,也是当前默认引擎。但要注意,当前 webpack 运行时还没有切到 common 驱动模型,仍然直接读取 legacy webpack 配置块。

字段类型默认值说明
extraPluginsArray[]额外追加到 webpack 配置中的插件实例
htmlWebpackPluginobject{}html-webpack-plugin 的配置
htmlWebpackTagsPluginobject{}html-webpack-tags-plugin 的配置
copyWebpackPluginPatternsArray[]copy-webpack-pluginpatterns

常见示例:

const path = require("path");
const webpack = require("webpack");

module.exports = {
  webpack: {
    entry: {
      app: "./src/main.js",
    },
    library: "navbar",
    publicPath: "/navbar/",
    isExtractCss: true,
    styleResourcesLoaderPatterns: ["./src/styles/variables.less"],
    copyWebpackPluginPatterns: [
      {
        from: path.resolve(__dirname, "src/static"),
        to: path.resolve(__dirname, "dist/static"),
      },
    ],
    htmlWebpackPlugin: {
      title: "Navim Demo",
    },
    htmlWebpackTagsPlugin: {
      tags: ["https://example.com/runtime.js"],
      append: false,
    },
    extraPlugins: [
      new webpack.DefinePlugin({
        __BUILD_NAME__: JSON.stringify("navim-demo"),
      }),
    ],
  },
};

webpack 内置行为:

  • 输出目录固定为 dist/
  • 主入口产物固定为 dist/app.js
  • 动态 chunk 输出到 dist/static/js/
  • 图片输出到 dist/static/images/
  • 字体输出到 dist/static/fonts/
  • libraryTarget 固定为 umd
  • 支持 .vue.css.less.styl.js.jsx
  • JS/JSX 使用 Babel
  • 开发态和生产态会按当前实现生成不同的 webpack 配置
  • common.output.library.*common.styles.extractcommon.assets.copy 等字段目前不会直接驱动 webpack 运行时

vite 配置

vite 现在同时支持开发和构建。

字段类型默认值说明
entrystring自动从 common.entry 兜底HTML 入口文件
rootElementIdstringappHTML loading 插件替换的根节点 id
optimizeDepsobjectinclude @heisea/brick / exclude vue-router, vuexVite 预构建配置
staticCopyTargetsArray内置主题 CSS 和 element-ui 字体复制静态资源
pluginsArray[]额外 Vite 插件

内置行为:

  • configFile=false,不会读取项目自己的 vite.config.*
  • 使用 @vitejs/plugin-vue2@vitejs/plugin-vue2-jsx
  • 代理配置来自 build/config.js
  • common.output.publicPath 会映射到 Vite 的 base
  • common.output.outDir 会映射到 Vite 的 build.outDir
  • common.resolve.aliascommon.resolve.extensions 会参与 Vite 解析
  • common.styles.resources 会通过 Less hack 注入
  • 会默认复制 @heisea/brick 的主题 CSS 和 element-ui 字体文件

示例:

module.exports = {
  vite: {
    entry: "./src/main.js",
    rootElementId: "app",
    optimizeDeps: {
      include: ["@heisea/brick"],
      exclude: ["vue-router", "vuex"],
    },
  },
};

rsbuild 配置

rsbuild 已接入统一 schema,并支持 devbuildanalyze 三条路径。自 1.1.0 起, rsbuild 引擎的能力已与 webpack 引擎对齐:less/stylus、Vue 2 JSX、@heisea/brick-loader、 微前端 UMD 产物等均由引擎内建,项目通常只需编写 common 配置。

字段类型默认值说明
pluginsArray[]额外 Rsbuild 插件(会与内建插件合并)
toolsobject{}Rsbuild tools 合并配置
configobject{}最终运行时配置覆盖

内置行为:

  • common.entry 会映射到 source.entry
  • common.output.publicPath 会映射到 output.assetPrefix
  • common.output.outDir 会映射到 output.distPath.root
  • common.dev.hostcommon.dev.portcommon.dev.opencommon.dev.headers 会映射到 server
  • common.resolve.aliascommon.resolve.extensions 会参与解析
  • common.styles.resources 会通过 @rsbuild/plugin-lesslessLoaderOptions.additionalData 注入(等价 webpack 的 style-resources-loader)
  • common.assets.copy 会映射到 output.copy
  • common.externals.dev / common.externals.micro 会按当前命令和微前端状态切换
  • 自动注册插件:@rsbuild/plugin-vue2@rsbuild/plugin-less@rsbuild/plugin-stylus@rsbuild/plugin-babel(Vue 2 JSX,使用 @vue/babel-preset-jsx,覆盖 .js/.jsx.vue<script> 块)
  • 自动对 .vue 应用 @heisea/brick-loader(仅处理主 .vue 请求,并关闭 vue-loader 的 experimentalInlineMatchResource 以避免冲突);为匹配项目的 @heisea/brick / vue 版本,优先从消费方项目解析 @heisea/brick-loader
  • module.parser.javascript.exportsPresence 默认设为 warn(与 webpack 行为一致:导入不存在的命名导出仅告警,不中断构建)
  • HTML 产物命名为 index.html

common.micro.enabled === true(微前端模式,single-spa)时,额外开启:

  • UMD 产物:库名取 common.output.library.name,格式取 common.output.library.format(默认 umd
  • 入口固定输出 app.js,异步 chunk 输出到 js/
  • 初始代码不分包(splitChunks.chunks: 'async',仅对动态 import() 拆分)
  • CSS 固定输出到 css/app.css 且不带 hash(对齐 single-spa-css 加载约定)

依赖要求:

  • @rsbuild/core 以及 @rsbuild/plugin-vue2/plugin-less/plugin-stylus/plugin-babel@vue/babel-preset-jsx@heisea/brick-loader 均已作为 Navim 的依赖随包提供,消费方无需单独安装
  • 消费方仍需安装与 vue 版本匹配的 vue-template-compiler(vue-loader 编译 .vue 必需,版本不一致会报 Vue packages version mismatch
  • 若项目使用 @heisea/brick,建议项目内安装与之匹配的 @heisea/brick-loader(Navim 会优先用项目内版本)

示例(single-spa + Vue 2 微前端,最简配置):

module.exports = (NODE_ENV) => ({
  common: {
    entry: {
      app: "./src/main.js",
    },
    output: {
      publicPath: "/demo/",
      library: { name: "demo-app", format: "umd" },
    },
    html: {
      template: "./public/index.html",
    },
    styles: {
      // 全局注入 less 变量(等价 style-resources-loader)
      resources: ["./src/styles/variables.less"],
    },
    define: {
      "process.env.NODE_ENV": JSON.stringify(NODE_ENV),
    },
    // 开启微前端产物:UMD + 入口 app.js + css/app.css(无 hash) + 初始不分包
    micro: { enabled: true },
  },
});

single-spa doctor

single-spa doctor 仍然是 webpack / legacy 配置链路下的升级工具,不属于三引擎统一能力。

执行边界:

  • 项目依赖中必须已经包含 single-spa-vue
  • 当前只支持单入口项目;如果 webpack.entry 中存在多个入口,会直接退出
  • 入口来源仍然是 legacy webpack.entry
  • 如果项目中还没有 single-spa-css,命令会尝试执行 pnpm add single-spa-css@^2.0.0
  • 命令会改写入口文件源码,补入 single-spa-css 相关逻辑
  • 已经升级过的入口文件再次执行会直接退出
  • vitersbuild 当前没有对应的 doctor 流程

环境变量加载规则

Navim 通过 dotenv + dotenv-expand 加载环境变量。

加载优先级从高到低如下:

  • .env.[NODE_ENV].local
  • .env.[mode]
  • .env.[NODE_ENV]
  • .env.local
  • .env

说明:

  • NODE_ENV 由 Navim 命令自身设置
  • mode 来自 --mode <type>
  • 同名变量以高优先级文件中的值为准

开发服务相关变量:

  • PORT:开发服务端口
  • HOST:开发服务 host

webpack 构建时会通过 DefinePlugin 注入:

  • process.env.NODE_ENV
  • process.env.navim_hash
  • 所有以 NAVIM_ 开头的变量,例如 NAVIM_API_BASE

示例:

PORT=9000
HOST=127.0.0.1
NAVIM_API_BASE=/api

业务代码中可直接读取:

console.log(process.env.NODE_ENV);
console.log(process.env.navim_hash);
console.log(process.env.NAVIM_API_BASE);

兼容性说明

  • 旧项目可以继续使用顶层 webpack / vite / rsbuild 配置
  • 新项目建议优先使用 common + 引擎覆盖的写法,但如果仍要跑 webpack,请保留 legacy webpack 字段
  • startvite startanalyzersingle-spa doctor 都保留为兼容入口
  • inspect 是当前用于查看翻译后运行时配置的推荐命令

常见注意事项

  • navim.config.js 必须位于项目根目录
  • build/config.js 必须存在;如果没有代理需求,也请导出空对象
  • public/index.html 必须存在
  • vitersbuild 都已经支持构建,不再只是开发服务
  • webpack 当前仍然依赖 legacy webpack 配置,不是完全由 common 驱动
  • single-spa doctor 会改写源码,执行前建议先提交或备份
  • single-spa doctor 只支持使用 single-spa-vue 的单入口 webpack 项目
  • 如果你在微前端场景中抽离了 CSS,构建完成后 Navim 会提示你接入 single-spa-css
  • 建议将 Navim 作为本地依赖安装,不建议只全局安装 CLI

FAQs

Package last updated on 09 Jun 2026

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts