从0开始搭建、上传npm包

从0开始搭建、上传npm包

  • 1、上传一个简单获取水果价格的包
    • [创建 `vite` 项目](#创建 vite 项目)
    • [在项目根目录 `src` 文件夹中创建 `index.ts` 文件,文件内容如下:](#在项目根目录 src 文件夹中创建 index.ts 文件,文件内容如下:)
    • [在 `main.ts` 文件中导入、导出上面创建的方法](#在 main.ts 文件中导入、导出上面创建的方法)
    • [创建 `vite.config.ts` 配置文件,文件内容如下](#创建 vite.config.ts 配置文件,文件内容如下)
    • [配置 `package.json` 文件,文件内容如下](#配置 package.json 文件,文件内容如下)
    • [添加 `README.md` 项目说明文件](#添加 README.md 项目说明文件)
    • 打包项目
    • [注册 `npm` 账号](#注册 npm 账号)
    • 项目中使用包
    • [修改 `npm` 包内容方法](#修改 npm 包内容方法)
  • 2、上传一个简单组件
    • [创建 `vite` 项目](#创建 vite 项目)
    • 创建自定义组件
    • [创建对应 `index.ts` 文件,文件内容如下:](#创建对应 index.ts 文件,文件内容如下:)
    • [配置 `vite.config.ts` 文件,文件内容如下:](#配置 vite.config.ts 文件,文件内容如下:)
    • 打包发布
    • 在页面中使用组件

1、上传一个简单获取水果价格的包

创建 vite 项目

js 复制代码
npm create vite

在项目根目录 src 文件夹中创建 index.ts 文件,文件内容如下:

js 复制代码
/**
 * 获取水果价格的方法
 * @param name 水果名称
 * @returns
 */
export const getPrice = (name: string) => {
  let price: number = 0.0;
  switch (name) {
    case "苹果":
      price = 9.99;
      break;
    case "香蕉":
      price = 7.89;
      break;
    case "梨":
      price = 6.65;
      break;
    case "榴莲":
      price = 9.65;
      break;
    case "菠萝":
      price = 5.42;
      break;

    default:
      throw new Error("未匹配到水果价格,请重新录入");
  }
  return price;
};

main.ts 文件中导入、导出上面创建的方法

js 复制代码
import { getPrice } from "./index";

export { getPrice };

创建 vite.config.ts 配置文件,文件内容如下

js 复制代码
import { defineConfig } from "vite";
export default defineConfig({
  build: {
    outDir: "dist", // 自定义构建输出目录
    target: "es2020",
    lib: {
      entry: "src/main.ts", // 入口文件路径
      formats: ["es", "cjs"],
    },
  },
});

配置 package.json 文件,文件内容如下

js 复制代码
{
  "name": "bagen-getPrice",
  "private": false,
  "version": "1.0.1",
  "type": "module",
  "main": "dist/bagen-getPrice.cjs",
  "module": "dist/bagen-getPrice.js",
  "scripts": {
    "serve": "vite",
    "build": "tsc && vite build",
    "preview": "vite preview"
  },
  "devDependencies": {
    "typescript": "^5.2.2",
    "vite": "^5.0.8"
  }
}

添加 README.md 项目说明文件

打包项目

js 复制代码
npm run build

注册 npm 账号

  • 官网
  • 配置 npm 源,在项目根目录中运行以下代码
js 复制代码
npm config set registry https://registry.npmjs.org
  • 登录 npm

输入:姓名 和 邮箱

js 复制代码
npm login
  • 发布
js 复制代码
npm publish

项目中使用包

  • 安装包
js 复制代码
npm install bagen-getPrice -S
  • 页面中使用
js 复制代码
import { getPrice } from 'bagen-getPrice'

getPrice('苹果')

修改 npm 包内容方法

  • 安装包
js 复制代码
npm install bagen-getPrice -S
  • 修改代码
  • 代码在 node_modules 文件夹中
  • package.json 文件中 更新版本号
  • 在自己包目录中运行如下代码:
js 复制代码
npm publish

2、上传一个简单组件

创建 vite 项目

js 复制代码
npm create vite

创建自定义组件

html 复制代码
<template>
  <input type="text" v-model="keyword" @keydown.enter="searchPriceHandle" />
  <br />
  {{ keyword }} {{ price }}
</template>

<script setup lang="ts">
import { ref } from "vue";
const keyword = ref<string>("");
const price = ref<string | number>("");

/**
 * 查询价格方法
 */
const searchPriceHandle = () => {
  switch (keyword.value) {
    case "苹果":
      price.value = 9.98;
      break;
    case "香蕉":
      price.value = 8.88;
      break;
    case "菠萝":
      price.value = 6.48;
      break;
    case "梨":
      price.value = 9.78;
      break;
    default:
      price.value = 0.0;
      throw new Error("未匹配到水果名称,请重新输入");
  }
};
</script>

<style lang="scss" scoped></style>

创建对应 index.ts 文件,文件内容如下:

  • components ->index.ts
js 复制代码
import { App } from "vue";
import custom from "./custom.vue";

const install = (app: App<Element>) => {
  app.component("Bg-Custom", custom);
};

export default {
  install,
};

配置 vite.config.ts 文件,文件内容如下:

js 复制代码
import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";

export default defineConfig({
  plugins: [vue()],
  build: {
    outDir: "dist", // 自定义构建输出目录
    target: "es2020",
    lib: {
      entry: "src/components/index.ts", // 入口哦文件路径
      name: "bg-get-price", // 暴漏的全局变量(最好把名称都统一)
      fileName: "bg-get-price", // 输出的包文件名,默认取 package.json 的 name
    },
    rollupOptions: {
      // 确保外部化处理那些你不想打包进库的依赖
      external: ["vue"],
      output: {
        // 在 UMD 构建模式下为这些外部化的依赖提供一个全局变量
        globals: {
          vue: "Vue",
        },
      },
    },
  },
});

打包发布

打包发布过程同上

在页面中使用组件

  • 安装包
js 复制代码
npm install bg-get-price -S
  • 注册,main.ts 文件中注册,代码如下:
js 复制代码
import bgGetPrice from "bg-get-price";
// 注册,重点
app.use(bgGetPrice)
  • 引用
html 复制代码
<bg-get-price></bg-get-price>

必须打包上传时候的名称一致

相关推荐
PBitW6 小时前
git 中容易遗忘的点 (三) 🚀🚀🚀
前端·git·面试
名字还没想好☜7 小时前
React setState 连续调用「丢更新」排查:批量更新与函数式更新
前端·javascript·react.js·react·usestate
come112347 小时前
Vue 2 与 Vue 3 语法区别及使用技巧
前端·javascript·vue.js
腻害兔7 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:ERP 企业资源模块,一个轻量级进销存的完整实现?
前端·javascript·vue.js·人工智能·前端框架·产品经理·ai编程
虹科网络安全7 小时前
艾体宝新闻|从 SQL 注入到服务器接管:CVE-2026-57517 暴露 Web 管理面板的供应链与安全编码风险
服务器·前端·sql
糖果店的幽灵7 小时前
langgraph的四种state解析
java·前端·javascript·langgraph
顺颂时绥_17 小时前
前端大图片压缩与安卓/苹果设备矫正实践
前端
Csvn8 小时前
JSON.parse 大数精度丢失:一个让前后端互相甩锅的 Bug
前端
Helen_cai8 小时前
OpenHarmony 项目统一全局样式、尺寸、色彩主题封装 ThemeUtil(API23)
开发语言·前端·javascript·华为·harmonyos
郑州光合科技余经理8 小时前
家政O2O平台解析:从0搭建上门预约小程序解决方案
android·java·开发语言·前端·小程序·架构·php