你可能不知道的package.json


大家好,我是若川。最近組織了源碼共度活動:1個月,200+人,一起讀了4周源碼,參與的小伙伴都表示收獲很大。如果感興趣可以點擊鏈接掃碼加我微信 ruochuan12。今天推薦一篇相對簡單的文章。

前言

在上一篇npm init @vitejs/app的背后,僅是npm CLI的冰山一角[1]中,有提到我復習npm主要是從兩個大方向來入手,所以這篇繼續來講講package.json這部分知識,經過這輪復習,也發現了自己的很多不足,之前把常用的命令和配置玩熟了,卻沒關心npm已經有了更多新的玩法,而這些玩法卻實實在在地在解決別人的問題。

npm 的配置還是挺多的,具體可以參考package.json官方文檔[2]。通讀了文檔之后,我略過了一些基礎的配置項,總結了一些我認為比較有用的配置項。

常用配置項

files

files定義了哪些文件應該被包括在 npm install 后的 node_modules中。

當然,有些文件是自動暴露出來的,不管你是不是配置了files,比如:

  • package.json

  • README / CHANGELOG / LICENSE

  • ...

很多庫都定義了 files,避免一些不必要的文件暴露到 node_modules 中。

vite 中是這樣配置的:

{"files":?[?"bin",?"dist",?"client.d.ts"?]
}

我之前就不知道這個配置,導致我發布的一個 npm 組件 vue-awesome-progress[3] 就暴露了源碼部分,雖然這也沒啥影響,本來就是開源的。但是這也增加了別人的資源下載量,也是一種浪費。所以,專業點的搞法還是加上files配置吧。

bin

bin 列出了可執行文件,表示你這個包要對外提供哪些腳本。

在這個包被 install 安裝時,如果是全局安裝 -g,bin 列出的可執行文件會被添加到 PATH 變量(全局可執行);如果是局部安裝,則會進入到 node_modules/.bin/ 目錄下。

bin 在一些 CLI 工具中用得很頻繁,比如 Vue CLI。

在開發 npm 包時,要求發布的可執行腳本要以#!/usr/bin/env node開頭,這是為什么呢?

我查了一下,原來是為了用于指明該腳本文件要使用 node 來執行。

main, browser, module

這三個配置對我們的影響還是挺大的。

  • main字段決定了別人require('xxx')時,引用的是哪個模塊對象。在不設置main字段時,默認值是index.js

  • 如果你開發的包是用于瀏覽器端的,那么用browser指定入口文件是最佳的選擇。

  • module則代表你開發的包支持ESM,并指定了一個ESM入口。

具體這三個字段怎么用,還是挺有學問的,這里推薦一篇文章package.json中你還不清楚的browser,module,main 字段優先級[4],講得挺細。

長圖警告!

scripts

scripts也基本上每天都用了,但是它的鉤子腳本你用過嗎?如果沒有用過,可以試試,在組織腳本流程時非常好用!

  • pre:在一個script執行前執行,比如prebuild,可以在打包前做一些準備工作。

  • post:在一個script執行后執行,比如postbuild,可以在打包后做一些收尾工作。

config

通過config配置的參數xxx,可以在腳本中通過npm_package_config_xxx 的形式引用,比如port

{"config":?{"port":?"8080"}
}

依賴相關

dependencies

dependencies可以理解為生產依賴,通過npm install --save安裝的依賴包都會進入到dependencies中。

devDependencies

devDependencies可以理解為開發環境依賴,通常是一些工具類的包,比如 webpack, babel等。通過npm install --save-dev安裝的依賴包都會進入到devDependencies中。

但是,在結合一些構建工具使用時,我們往往會有困惑。比如我安裝了一個包到devDependencies中,但是不小心在項目中引用了它,最后也被 webpack 打包到構建結果中了。這是怎么回事呢?

建議結合上篇文章npm install這一節[5]一起看。

peerDependencies

我是package-a,你裝我,你就必須裝我的peerDependencies

讓“調包俠”將package-a的依賴提升到自己的node_modules中,這樣可以在“調包俠”和package-a都需要同一個依賴(比如vue)時,避免重復安裝。這常見于開發組件或者庫。

注意,一個 npm 包的開發者如果聲明了peerDependencies,開發環境下在該包目錄npm install也不會在node_modules中安裝這些依賴,所以往往還需要借助devDependencies

舉個例子,我開發一個組件,不想發布到 npm 時包含了 vue 的代碼,這就需要外部提供 vue ,所以我把 vue 定義在 peerDependencies 也無可厚非。但是,在開發組件時,一般還需要本地開發環境跑一個 demo 試試效果,這時候是依賴 vue 的,所以還需要在 devDependencies 中安裝 vue 。我看了下 vue-router 就是這么做的,所以我在開發自己的組件時也學會了這招。

bundledDependencies

bundledDependencies跟上面的依賴都不太一樣,配置上不是鍵值對的形式,而是一個數組。

{"bundledDependencies":?["vue","vue-router"]
}

在運行npm pack時,會將對應依賴打包到tgz文件中。用得不多,不知道具體的細節,主要還是直接用npm install安裝 tgz 包的場景比較少,有個概念就行。

optionalDependencies

optionalDependencies用于配置可選的依賴,即使配了這個,代碼里也要做好判斷(保護),否則運行報錯就不好玩了。

try?{var?foo?=?require('foo')var?fooVersion?=?require('foo/package.json').version
}?catch?(er)?{foo?=?null
}

題外話

仔細讀過package.json文檔后,整體上還是解決了我的不少困惑,對我開發 npm 組件也提供了不少幫助。如果您想了解更多細節和實戰,不妨打開我這個項目vue-awesome-progress[3]看看,希望對您有所幫助!

參考

[1]

npm init @vitejs/app的背后,僅是npm CLI的冰山一角: https://juejin.cn/post/6950817077670182943

[2]

package.json官方文檔: https://docs.npmjs.com/cli/v7/configuring-npm/package-json

[3]

vue-awesome-progress: https://cumt-robin.github.io/vue-awesome-progress/

[4]

package.json中你還不清楚的browser,module,main 字段優先級: https://www.cnblogs.com/qianxiaox/p/14041717.html

[5]

上篇文章npm install這一節: https://juejin.cn/post/6950817077670182943#heading-6

最近組建了一個江西人的前端交流群,如果你是江西人可以加我微信?ruochuan12?私信 江西?拉你進群。

推薦閱讀

1個月,200+人,一起讀了4周源碼
我讀源碼的經歷

老姚淺談:怎么學JavaScript?

我在阿里招前端,該怎么幫你(可進面試群)

·················?若川簡介?·················

你好,我是若川,畢業于江西高校。現在是一名前端開發“工程師”。寫有《學習源碼整體架構系列》多篇,在知乎、掘金收獲超百萬閱讀。
從2014年起,每年都會寫一篇年度總結,已經寫了7篇,點擊查看年度總結。
同時,活躍在知乎@若川,掘金@若川。致力于分享前端開發經驗,愿景:幫助5年內前端人走向前列。

識別方二維碼加我微信、拉你進源碼共讀

今日話題

略。歡迎分享、收藏、點贊、在看我的公眾號文章~

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

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

相關文章

基于上下文的rpn_構建事物-產品評論視頻中基于上下文的情感分析

基于上下文的rpnThe word “Social” has taken a whole new meaning in today’s digital era. Simply going out to enjoy is no longer the only “social” criteria. Social now is — giving a peek in your personal and professional life to your connections. Facebo…

可愛的 Python: 使用 mechanize 和 Beautiful Soup 輕松收集 Web 數據

可愛的 Python: 使用 mechanize 和 Beautiful Soup 輕松收集 Web 數據 使用 Python 工具簡化 Web 站點數據的提取和組織 David Mertz, Ph.D., 開發人員, Gnosis Software, Inc.從 2000 年開始,David Mertz 就一直在為 developerWorks 專欄 Charming Python 和 XML M…

廣西工學院c語言試題答案,廣西工學院的C語言考試試題

廣西工學院鹿山學院 2005 — 2006 學年第 2 學期課程考核試題 考核課程 《C語言程序設計》 (A卷)考核班級 學生數 印數 考核方式 閉卷 考核時間 120 分鐘一、選擇題(每題2分,共40分)1. 一個C語言的源程序中, 。A.必須有一個主函數2. 下列數據…

JavaScript 斷點調試技巧

大家好,我是若川。最近組織了源碼共度活動:1個月,200人,一起讀了4周源碼,參與的小伙伴都表示收獲很大。如果感興趣可以點擊鏈接掃碼加我微信 ruochuan12。之前推薦過很多次調試文章,說明調試的重要性&#…

大學生電子設計大賽案例分析_為大學生設計問答平臺—案例研究

大學生電子設計大賽案例分析Dealing with academic-related questions like picking a course, fulfilling a major requirement can be tedious and ineffective when you have to simultaneously balance school work, social activities, and focus on personal growth and …

最新最詳細最簡潔Eclipse調試PHP配置詳解(Xdebug,Zend Debugger)

搬家注:該日志寫于2011 年 04 月 07 日,Eclipse,PHP等版本號很多,更新也比較快,請注意文章中的版本。本文不一定幫您解決問題,但能給您一些解決問題的思路及一些概念。 最近開始做SRTP項目WebOS&#xff0c…

按鍵精靈易語言c,求助(把按鍵精靈的源碼轉為易語言的)

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓MoveTo 1203,673IfColor 1203,673,"252489",2 ThenMoveTo 417, 242Delay 10072LeftDown 1LeftClick 1LeftUp 1MoveTo 982, 551Delay 7660LeftDoubleClick 1Delay 10Delay 30LeftUp 1LeftUp 1LeftUp 1MoveTo 1102, 709Del…

入門前端學習路線圖【送書】

大家好,我是若川。記得點上方音頻聽小姐姐配音,超級好聽。華章圖書又贊助了書籍送福利給大家。本次送4本書的抽獎方式是:截止到9月6日(周一)20:00,在留言區留言任意內容。我會在留言區抽取「1位」關注我公眾…

單選按鈕設置為被選中狀態_為什么要設置錯誤的按鈕狀態

單選按鈕設置為被選中狀態當正確的方法出錯時 (When the right way goes wrong) Let’s say you want to create a click effect on an HTML button. The first idea that many people get is to do something that reproduces the feeling of the sound emitted by a real but…

「娃娃分享」-常見自校檢分析實例.

自校檢是許多軟件的保護手段之一,對軟件加個簡單的殼再增加自校檢在一定程序上可以抵擋住一大部分新手,不過,對許多人來說,這個保護已經很弱了。。下面講幾種常見的解決自校檢方法,寫的粗略,希望大家補充。…

用VC和MinGW導出dll的def和lib(a)文件

為什么80%的碼農都做不了架構師?>>> 原文地址:http://zhangyafeikimi.iteye.com/blog/404580 有了dll文件需要導出def文件: pexports zlib1.dll > zlib1.def 有了dll和def文件,需要導出MinGW的.a文件:…

51中斷編程c語言,[新人求指教]51C語言編程可否用中斷令循環結束提早結束

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓C51_C語言編程控制流水燈硬件電路 p0 接 led 8 個,P33 接按鍵使用中斷2開機燈按1~8逐位閃爍,并循環按鍵后改為 兩燈亮 的流水燈下面寫了個程序#include #include #define uchar unsigned char#define uint u…

產品設計美學案例分析_美學在產品設計中的重要性

產品設計美學案例分析重點 (Top highlight)In one of my previous jobs, I had really interesting debates with the CEO regarding whether we should spend more time improving the way our app looks and feels. ‘How could he not care that the design is outdated?! …

即將到來的ECMAScript 2022標準

大家好,我是若川。周末分享一篇相對簡單的文章。最近組織了源碼共度活動:1個月,200人,一起讀了4周源碼,參與的小伙伴都表示收獲很大。如果感興趣可以點擊鏈接掃碼加我微信 ruochuan12。另外:昨天的推文入門…

c語言中二叉樹中總結點,C語言二叉樹的三種遍歷方式的實現及原理

二叉樹遍歷分為三種:前序、中序、后序,其中序遍歷最為重要。為啥叫這個名字?是根據根節點的順序命名的。比如上圖正常的一個滿節點,A:根節點、B:左節點、C:右節點,前序順序是ABC(根節…

動態庫的創建與使用

1、動態庫文件的創建 (1)編寫源文件 (2)編譯生成動態庫 g -fPIC -shared -o libfile_operation.so file_operation.cpp 此編譯過程分為兩步,等同于下面的兩個命令: g -c -fPIC file_operation.cpp …

ux設計中的各種地圖_UX寫作中的移情

ux設計中的各種地圖Demetri Martin is a master of comedic situations. If you’ve never seen Demetri Martin是喜劇情境的大師。 如果你從未見過 him before, he has a sort of dry brand of observational humor, relying more on anecdotes than full stories, and often…

字符串搜索。HOJ1530 Compound Words。

stl set實現字符串搜索。。效率一般。(附二分搜索。) Compound WordsTime limit:1sec.Submitted:233Memory limit:32MAccepted:81Source: Waterloo ACM Programming Contest Sep 28, 1996 You are to find all the two-word compound words in a dictionary. A two-word compo…

字節3-1前端面試官自學Vue的正確姿勢

大家好,我是若川。前不久和一個字節前端TL朋友聊天,說到大廠前端供需脫節的情況。特別是使用Vue框架的,因為簡單易學好上手,但是能夠深入理解的人并不多,大多都只停留在應用層面,缺乏更深層面的理解。尤其是…

android視圖工具,android studio的HierarchyViewer工具如何知道android屏幕的視圖屬性

讓我們首先看看adb是如何組織的.它有3個主要組件,如here所述 –> client – 在用于開發的機器上運行的客戶端.通過發出adb命令從shell調用客戶端.層次結構查看器還會創建adb客戶端.> server – 在開發計算機上作為后臺進程運行的服務器.它將從adb客戶端發出的命令傳遞給a…