在项目中将npm包本地管理

210 阅读5分钟

npm上有大量好用的开源包可以使用,好用的轮子可以让我们的工作事半功倍。

但在开发中有时会碰到以下情况而选择在本地项目中维护包:

  • 需要修改某个包的源码;
  • 出于网络等原因,包无法通过npm install 下载到本地;
  • 自建的一个npm包,没有发布到npm。

本文章基于的工具版本:

  • node :v20.11.1
  • npm:10.2.4
  • vite:5.0.11

--这里需要注意不同的版本之间可能会有些不兼容的问题--

在本地项目中维护一个npm包

1、在根路径新建一个lib文件夹,用于管理本地包。将已安装的node_modules中的需要本地管理的包文件移动到lib文件夹下:

  

2、修改package.json中的包的路径。这样在通过包名使用包的时候,指向的就是本地文件路径lib/vite-plugin-qiankun

3、安装。执行npm i,lib/vite-plugin-qiankun也会被下载到node_modules中

4、运行和打包

npm run dev 运行项目,npm run build进行项目打包。

有些包在作为本地包的时候,编译可能会出错。

将node_modules中的包修改为本地包可能会碰到的问题

1、commonjs兼容问题

将vite-plugin-qiankun的包修改为本地包,运行时报错。

Uncaught (in promise) SyntaxError: The requested module '/lib/vite-plugin-qiankun/dist/helper.js?t=1732852087844' does not provide an export named 'qiankunWindow' (at axios.ts:11:10)

这个错误提示表明在使用 Vite 和 Qiankun 时,尝试从 vite-plugin-qiankun 模块中没有导出 qiankunWindow

...
import { qiankunWindow } from 'vite-plugin-qiankun/dist/helper'
...

查看vite-plugin-qiankun的源码。

vite-plugin-qiankun/dist/helper.js

/*!
 * vite-plugin-qiankun.js v1.0.14
 * (c) 2021-2022 Teng Mao Qing
 * Released under the MIT License.
 */
'use strict';

Object.defineProperty(exports, '__esModule', { value: true });

var qiankunWindow = typeof window !== 'undefined' ? (window.proxy || window) : {};
var renderWithQiankun = function (qiankunLifeCycle) {
  // 函数只有一次执行机会,需要把生命周期赋值给全局
  if (qiankunWindow === null || qiankunWindow === void 0 ? void 0 : qiankunWindow.__POWERED_BY_QIANKUN__) {
    if (!window.moudleQiankunAppLifeCycles) {
      window.moudleQiankunAppLifeCycles = {};
    }
    if (qiankunWindow.qiankunName) {
      window.moudleQiankunAppLifeCycles[qiankunWindow.qiankunName] = qiankunLifeCycle;
    }
  }
};

exports.default = renderWithQiankun;
exports.qiankunWindow = qiankunWindow;
exports.renderWithQiankun = renderWithQiankun;

在这里我们可以看到使用了CommonJS的导出,但是vite默认支持的是ES Module,也就无法正确解析和打包这些 CommonJS 模块。

解决方法

vite-plugin-commonjs 可以将 CommonJS 模块转换为 ES Modules,这样 Vite 就可以正常处理和打包这些模块

1、安装

要使用 vite-plugin-commonjs,首先需要安装它。你可以通过 npm 或 yarn 来安装:

npm install vite-plugin-commonjs --save-dev
# 或者
yarn add vite-plugin-commonjs --dev

2、使用

安装完成后,你需要在 Vite 的配置文件中引入和使用这个插件。以下是一个基本的配置示例:

// vite.config.js
import { defineConfig } from 'vite';
import commonjs from 'vite-plugin-commonjs';

export default defineConfig({
  plugins: [
    commonjs()
  ]
});

vite-plugin-commonjs

vite-plugin-commonjs 是一个用于 Vite 的插件,它的主要作用是帮助 Vite 构建工具处理和支持 CommonJS 模块。Vite 是一个现代前端构建工具,默认支持 ES Modules(ESM)。但是,在实际项目中,特别是当你依赖一些老旧的库时,这些库可能仍然使用 CommonJS 模块格式。这时候,vite-plugin-commonjs 就派上用场了。

主要作用
  1. 转换 CommonJS 模块
    • vite-plugin-commonjs 可以将 CommonJS 模块转换为 ES Modules,这样 Vite 就可以正常处理和打包这些模块。
  1. 兼容性提升
    • 通过支持 CommonJS 模块,vite-plugin-commonjs 扩展了 Vite 的兼容性,使其能够处理更多的第三方库和模块。
  1. 无缝集成
    • 插件可以自动检测和处理 CommonJS 模块,减少了手动配置的复杂性。
兼容性和性能
  • 兼容性vite-plugin-commonjs 提升了 Vite 对于老旧库的兼容性,使得开发者可以在现代构建工具中使用更多的第三方库。
  • 性能:虽然增加了一个插件,但 vite-plugin-commonjs 的设计和实现考虑了性能问题,尽量减少对构建速度的影响。
  • 问题参考链接:keqingrong.cn/blog/2021-1…

2、vite版本不兼容

错误信息如下:

vite.config.ts:47:7 - error TS2769: No overload matches this call. The last overload gave the following error. Type 'import("D:/mycode/vscode workplace/zqBG/gc-industry-gallery/lib/vite-plugin-qiankun/node_modules/vite/dist/node/index").PluginOption' is not assignable to type 'import("D:/mycode/vscode workplace/zqBG/gc-industry-gallery/node_modules/vite/dist/node/index").PluginOption'.

这个错误通常是因为你的项目中使用了多个不同版本的 Vite,导致类型不匹配。

解决方法:

  1. 检查 Vite 版本:
    确保在你的项目中新安装的所有包都使用相同的 Vite 版本。你可以通过在项目根目录下运行以下命令查看 Vite 和相关插件的版本:
npm list vite

img_v3_02h3_ef6c1155-f016-4561-8997-03c47184658g.jpg

2、更新vite版本。在vite列表中发现在本地项目中的包vite-plugin-qiankun与项目的vite不一致,可选择升级本地包的vite与项目保持一致。

进入到包根路径,通过npm i 包名@版本 安装对应版本vite。

npm i vite@5.4.1

将自建的JavaScript文件作为本地的npm包

要使自建的JavaScript文件作为本地的npm包使用,需要按照以下步骤操作:

  1. 准备环境:确保你的本地已经安装了Node.js和npm(或yarn)。

  2. 初始化包:在你的JavaScript文件所在目录中,运行命令 npm init -y。这个命令会生成一个package.json文件,它是Node.js包的元数据文件。

  3. 配置package.json:编辑生成的package.json文件,添加必要的字段,如name(包名)、version(版本号)、description(描述)等。

  4. 使用你的本地包:在任何Node.js项目中,你可以通过运行 npm install . 来安装你本地目录下的这个npm包。

参考文档:blog.csdn.net/fanweilin01…