【制作npm包5】npm包制作完整教程,我的第一個npm包

制作npm包目錄

本文是系列文章, 作者一個橙子pro,本系列文章大綱如下。轉載或者商業修改必須注明文章出處

一、申請npm賬號、個人包和組織包區別
二、了解 package.json 相關配置
三、 了解 tsconfig.json 相關配置
四、 api-extractor 學習
五、npm包制作完整教程,我的第一個npm包


本文涉及知識較多,建議認真閱讀前面的文章。

認識node_modules

我們打開任意一個項目的node_modules文件夾
在這里插入圖片描述
這里.bin是一些可執行文件,npm run xxx之所以能運行,是這里面的bin文件發揮了作用。.cache 是一個緩存文件夾,通常是打包工具為了提高項目再次啟動的效率創建的。vite 搭建的項目還可以看到 .vite 文件夾,這個是.vite是它的緩存。有時候在包升級或者降級時,發現并沒有更新,可能就是這里的緩存出了問題,刪除緩存,重新啟動即可。而無需刪除整個node_modules文件夾。

找到我們熟悉的vue,看到他的所有文件。
在這里插入圖片描述

這個項目包含了dist,是vue官方打包文件
LICENSE是證書文件
README.md是文檔說明
package.json 是配置文件

這幾個項目通常是一個npm包當中必須存在的一些配置。

點開他的package.json, 如下配置

 "main": "dist/vue.runtime.common.js","module": "dist/vue.runtime.esm.js","name": "vue","typings": "types/index.d.ts", // typings 有時寫成 types

可以看得到分別導出了commonjsests類型這幾個配置。當我們在一個項目當中執行import { xxx } from "vue" 的時候,實際上是從package.json文件當中找到他的name這個屬性,這里 from “vue”這個vue就是配置文件當中的名字。

制作第一個npm包

在制作包之前,強烈建議將前幾部分的文章鞏固一下。

初始化package.json配置

這里以制作組織安裝包為例,由于普通安裝包和組織包在外觀上只有包名上的區別。所以學會制作組織包,就等于學會了制作一般的安裝包。

  1. 找個合適的文件夾,我這里取名叫做npm-pkg-by-vite

  2. 在文件夾打開cmd命令行輸入npm init --yes
    vscode打開當前文件夾,可以看到package.json 文件如下,按如下描述,對這個包進行一定的修改。

{"name": "npm-pkg-by-vite","version": "1.0.0", // 暫且修改為0.0.0"description": "", // 修改為自己合適的描述"main": "index.js", "scripts": {"test": "echo \"Error: no test specified\" && exit 1"},"keywords": [],"author": "", // 修改為自己的名字"license": "ISC"
}
  1. 申請一個git倉庫,我這里github為例。用途在這篇文章《【制作npm包2】了解 package.json 相關配置》進行了詳細描述

  2. 初始化倉庫

  • cmd輸入命令npm init --scope=v3p ,這里的v3p是我申請的組織的名稱,這里需要更換成自己申請的名字。
  • package name:首先看到控制臺提示@組織/npm-pkg-by-vite的字樣,如果需要修改,輸入自定義名字就可以了。無需修改,直接回車鍵。
  • version:版本號提示1.0.0,看心情,我這里直接回車即可
  • description:輸入描述,我這里輸入我的第一個npm包
  • git repository:git分支,我這里輸入https://github.com/vue3plugin/npm-pkg-by-vite
  • author:我這里輸入,一個橙子pro
  • license:我這里輸入,MIT
  • Is this OK? :直接回車就行。
    CMD命令窗口提示文字
    再打開package.json文件查看,這里,在main下方加一個type參數
{"name": "@v3p/npm-pkg-by-vite","version": "1.0.0","description": "我的第一個npm包","main": "index.js","type": "module", // 修改為module,我們的目標包文件使用`ts`語法。"scripts": {"test": "echo \"Error: no test specified\" && exit 1"},"keywords": [],"author": "一個橙子pro","license": "MIT","repository": {"type": "git","url": "git+https://github.com/vue3plugin/npm-pkg-by-vite.git"},"bugs": {"url": "https://github.com/vue3plugin/npm-pkg-by-vite/issues"},"homepage": "https://github.com/vue3plugin/npm-pkg-by-vite#readme"
}
  1. 安裝依賴,我這里使用vite這個打包工具,同時插件需要打包.vue的文件。直接上命令

npm i vite vue vue-tsc typescript tslib howtools @vitejs/plugin-vue @types/node @tsconfig/node18 @microsoft/api-extractor -D

配置ts環境

創建tsconfig.json 以及tsconfig.types.json文件。將第章節【制作npm包3】了解 tsconfig.json 相關配置中相關配置復制進去。

配置api-extractor

參照章節【制作npm包4】api-extractor 學習

創建scripts文件夾,創建cleanup.js文件

內容如下

// This file is executed from npm script with project root as cwd.
import fs from 'node:fs'// 這個是我們在tsconfig.types.json設置的輸出目錄
fs.rmSync('dist/types', { recursive: true }) // 這個操作是把npm-pkg-by-vite.d.ts 換成 index.d.ts 便于package.json通用設置
fs.renameSync('dist/npm-pkg-by-vite.d.ts', 'dist/index.d.ts')

初始化vite配置

創建vite.config.ts,將以下內容復制進去,vite更多配置參照官網。

import { defineConfig } from "vite";
import vue from '@vitejs/plugin-vue';export default defineConfig({build: {lib: {entry: "./src/index.ts", // 入口文件fileName: (format) => `index.${format}.js`,formats: ['es', "cjs"], // 打包同時支持`es`和`commonjs`},rollupOptions: {external: ['vue'], // 這里表示不進行打包的文件},cssCodeSplit: false, // css 文件不分割outDir: "dist", // 打包輸出目錄minify: "esbuild", // 壓縮模式},plugins: [vue(), // 支持`.vue`文件]
})

項目相關文件創建

  1. 創建src文件夾并創建index.ts文件,隨意寫入文件內容即可。創建demo文件夾,寫一個簡單的vue項目即可。
  2. package.json文件 scripts設置如下
"scripts": {"dev:demo": "cd example && vite", // 運行demo"build:demo": "cd example && vite build", // 創建demo"build": "vite build", // 庫打包// 打包類型文件,vue-tsc 相當于 ts的 `tsc`命令,效果相同"build-types": "vue-tsc -p ./tsconfig.types.json && api-extractor run -c api-extractor.json && node scripts/cleanup.js", // 打包庫文件和類型文件"build-all": "npm run build && npm run build-types" },

執行npm run build-all,dist目錄輸出文件。

項目發布

一個完整的npm包至少包含,main入口文件配置,dist打包的文件包,README.md文件。這樣才能保證我們的項目發布到npm之后可以被正常使用。

這個時候,用到前邊章節的內容。在package.json文件當中增加files配置。

"files": ["dist"],

表示只有dist文件夾上傳到npm,其他的會忽略。這里不必擔心的是,我們的開源證書、README.md文件、package.json 文件不會因為這個設置,而不進行上傳。這個也是合理的,畢竟這些文件都是npm包必須的文件。

由于經過上述打包之后,我們生成了commonjsests類型這幾類文件,可以像vue項目那樣進行配置。

除了這幾個配置,還好細細說下exports這個配置。這個在前面章節有提及,還有一些細節需要在這里進行補充。有時我們打包之后的文件是需要分模塊導出的,而不是全部直接導出。這里舉個例子:

https://www.npmjs.com/package/howuse?activeTab=code
在這里插入圖片描述
在這個文件夾當中看到很多的子包,從名稱來看,每個子包都有自己的依賴,如果從index.js直接導出,未免這個包會很重。如果只想使用pdf這個包,無緣無故的把其他的項目也會打包到我們項目當中,對treeshaking優化十分不利。

它的package.json 文件是這樣配置的

 "exports": {"./axios": {"import": "./axios/axios.es.js","require": "./axios/axios.cjs.js","types": "./axios/index.d.ts"},"./echarts": {"import": "./echarts/echarts.es.js","require": "./echarts/echarts.cjs.js","types": "./echarts/index.d.ts"},// ... },

那么在使用的時候,可以這樣使用了import { xx } from 'howuse/echarts'或者require('howuse/echarts'),項目名加上子路徑的名稱,就可以直接識別到項目下面的文件目錄了。這樣以來,就比上邊mainmoduletypings這種散裝的配置靈活不少。

【完結】

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/40595.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/40595.shtml
英文地址,請注明出處:http://en.pswp.cn/news/40595.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MySQL的配置文件my.cnf與my.ini

一、my.cnf與my.ini win系統,MySQL配置文件為my.ini 其他系統(Ubuntu、CentOS、macOS)MySQL配置文件為my.cnf 二、my.cnf與my.ini的路徑 2.1 默認路徑 MySQL 的配置文件 my.cnf 可能位于多個位置,具體取決于安裝方式和操作系統。以下是一…

Redis如何處理內存溢出的情況?

當Redis的內存使用達到上限時,會出現內存溢出的情況。Redis提供了幾種處理內存溢出的機制: 內存淘汰策略:Redis提供了多種內存淘汰策略,用于在內存不足時選擇要移除的鍵。常見的淘汰策略包括: LRU(Least Re…

2023年國賽數學建模思路 - 案例:最短時間生產計劃安排

文章目錄 0 賽題思路1 模型描述2 實例2.1 問題描述2.2 數學模型2.2.1 模型流程2.2.2 符號約定2.2.3 求解模型 2.3 相關代碼2.4 模型求解結果 建模資料 0 賽題思路 (賽題出來以后第一時間在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 最短時…

Kotlin開發筆記:使用委托進行拓展

Kotlin開發筆記:使用委托進行拓展 導言 在OO語言(面向對象)中,我們經常會用到委托或者代理的思想。委托和代理在乍一看很相似,其實其各有各的側重點,這里我引用ChatGpt的回答: 委托(Delegation&#xff09…

探索C語言中的常見排序算法

探索C語言中的常見排序算法 排序算法是計算機科學中至關重要的基礎知識之一,它們能夠幫助我們對數據進行有序排列,從而更高效地進行搜索、插入和刪除操作。在本篇博客中,我們將深入探討C語言中的一些常見排序算法,包括它們的工作…

在C中使用Socket實現多線程異步TCP消息發送

目錄 基礎知識開始實現主要函數說明結束語 在本篇文章中,我們會探討如何在C語言中使用socket來實現多線程,異步發送TCP消息的系統。雖然C標準庫并沒有原生支持異步和多線程編程,但是我們可以結合使用POSIX線程(pthread&#xff09…

Java解決四大查找(一)

Java解決四大查找 一.線性查找1.1 題目1.2 思路分析1.3 代碼演示 二.二分查找(雙指針法)2.1 題目2.2 思路分析(圖解加文字)2.3 代碼演示 一.線性查找 1.1 題目 在數組{1,8,1024,521,1889}中查找數字8,如果有&#xff…

【知識分享】高防服務器的防御機制

【知識分享】高防服務器的防御機制 易受到攻擊的網站選擇接入高防服務更安全,大家對于這個都清楚!但是對于高防服務如何實現防御來保障安全的,又了解多少呢?今天壹基比小源(貳伍壹叁壹叁壹貳玖捌)就來說說高防服務實現防御的常規…

地址解析協議-ARP

ARP協議 無論網絡層使用何種協議,在實際網絡的鏈路上傳輸數據幀時,最終必須使用硬件地址 地址解析協議(Address Resolution Protocol,ARP):完成IP地址到MAC地址的映射,每個主機都有一個ARP高速緩…

【數據結構】二叉樹篇| 綱領思路02+刷題

博主簡介:努力學習的22級計算機科學與技術本科生一枚🌸博主主頁: 是瑤瑤子啦每日一言🌼: 所謂自由,不是隨心所欲,而是自我主宰。——康德 目錄 一、前言二、刷題1、翻轉二叉樹 2、二叉樹的層序遍歷?3、 二…

線性代數再回顧

最近,在深度學習線性代數,之前大一的時候學過線性代數,但那純屬于是應試用的,考試一考完,啥都忘了,也說出不出個所以然,所以,在B站的MIT的線性代數以及3blue1brown線性代數的本質中去…

git命令使用

君子拙于不知己,而信于知己。——司馬遷 清屏:clear 查看當前面板的路徑:pwd 查看當前面板的文件:ls 創建文件夾:mkdir 文件夾名 創建文件:touch 文件名 刪除文件夾:rm -rf 文件夾名 刪除文件:r…

Remote Sensing,2023 | 基于SBL的分布式毫米波相干雷達成像的高效實現

Remote Sensing,2023 | 基于SBL的分布式毫米波相干雷達成像的高效實現 注1:本文系“無線感知論文速遞”系列之一,致力于簡潔清晰完整地介紹、解讀無線感知領域最新的頂會/頂刊論文(包括但不限于 Nature/Science及其子刊; MobiCom, Sigcom, MobiSys, NSDI…

爬蟲IP時效問題:優化爬蟲IP使用效果實用技巧

目錄 1. 使用穩定的代理IP服務提供商: 2. 定期檢測代理IP的可用性: 3. 配置合理的代理IP切換策略: 4. 使用代理IP池: 5. 考慮代理IP的地理位置和速度: 6. 設置合理的請求間隔和并發量: 總結 在爬蟲過…

python知識:什么是字符編碼?

前言 嗨嘍,大家好呀~這里是愛看美女的茜茜吶 我們的MySQL使用latin1的默認字符集, 也就是說,對漢字字段直接使用GBK內碼的編碼進行存儲, 當需要對一些有漢字的字段進行拼音排序時(特別涉及到類似于名字這樣的字段時…

Docker網絡與資源控制

一、Docker 網絡實現原理 Docker使用Linux橋接,在宿主機虛擬一個Docker容器網橋(docker0),Docker啟動一個容器時會根據Docker網橋的網段分配給容器一個IP地址,稱為Container-IP,同時Docker網橋是每個容器的默認網關。因為在同一宿…

Oracle外部表ORACLE_LOADER方式加載數據

當數據源為文本或其它csv文件時,oracle可通過使用外部表加載數據方式,不需要導入可直接查詢文件內的數據。 1、如下有一個文件名為:test1.txt 的數據文件。數據文件內容為: 2、使用sys授權hr用戶可讀寫 DATA_PUMP_DIR 目錄權限&a…

探索未來:元宇宙與Web3的無限可能

隨著科技的奇跡般發展,互聯網已經成為了我們生活的不可分割的一部分。然而,盡管它的便利性和普及性帶來了巨大的影響,但我們仍然面臨著傳統互聯網體驗的諸多限制。 購物需要不斷在實體店與電商平臺間切換,教育依然受制于時間與地…

Unity如何把游戲導出成手機安裝包

文章目錄 前言使用環境步驟添加場景構建APK 前言 本文章主要演示了,如何將制作好的游戲,導出成APK,安裝到手機上。 使用環境 Unity2022。 步驟 首先打開你的項目,然后選擇菜單欄的“File” > “Build Settings…”&#xf…

QMainwindow窗口

QMainwindow窗口 菜單欄在二級菜單中輸入中文的方法給菜單欄添加相應的動作使用QMenu類的API方法添加菜單項分隔符也是QAction類 工具欄添加工具欄在狀態欄中添加控件工具欄添加其他類型的工具工具欄的屬性添加多個工具欄使用窗口添加使用代碼添加 狀態欄常用API在狀態欄顯示信…