gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長資訊網
最全最豐富的資訊網站

淺析nodejs項目中的package.json的常見配置屬性

本篇文章帶大家了解一下node項目中的package.json配置文件,聊聊package.json中一些常見配置屬性、環境相關屬性、依賴相關屬性和三方屬性,希望對大家有所幫助!

淺析nodejs項目中的package.json的常見配置屬性

npm是前端開發人員廣泛使用的包管理工具,項目中通過package.json來管理項目中所依賴的npm包的配置。package.json就是一個json文件,除了能夠描述項目的包依賴外,允許我們使用“語義化版本規則”指明你項目依賴包的版本,讓你的構建更好地與其他開發者分享,便于重復使用。 本文主要從最近的實踐出發,結合最新的npm和node的版本,介紹一下package.json中一些常見的配置以及如何寫一個規范的package.json


一、package.json

1. package.json簡介

在nodejs項目中,package.json是管理其依賴的配置文件,通常我們在初始化一個nodejs項目的時候會通過:

npm init

然后在你的目錄下會生成3個目錄/文件, node_modules, package.json和 package.lock.json。其中package.json的內容為:

{     "name": "Your project name",     "version": "1.0.0",     "description": "Your project description",     "main": "app.js",     "scripts": {         "test": "echo "Error: no test specified" && exit 1",     },     "author": "Author name",     "license": "ISC",     "dependencies": {         "dependency1": "^1.4.0",         "dependency2": "^1.5.2"     } }

上述可以看出,package.json中包含了項目本身的元數據,以及項目的子依賴信息(比如dependicies等)。

2. package-lock.json

我們發現在npm init的時候,不僅生成了package.json文件,還生成了package-lock.json文件。那么為什么存在package.json的清空下,還需要生成package-lock.json文件呢。本質上package-lock.json文件是為了鎖版本,在package.json中指定的子npm包比如:react: "^16.0.0",在實際安裝中,只要高于react的版本都滿足package.json的要求。這樣就使得根據同一個package.json文件,兩次安裝的子依賴版本不能保證一致。

而package-lock文件如下所示,子依賴dependency1就詳細的指定了其版本。起到lock版本的作用。

{     "name": "Your project name",     "version": "1.0.0",     "lockfileVersion": 1,     "requires": true,     "dependencies": {         "dependency1": {             "version": "1.4.0",             "resolved":  "https://registry.npmjs.org/dependency1/-/dependency1-1.4.0.tgz",             "integrity":  "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA=="         },         "dependency2": {             "version": "1.5.2",             "resolved":  "https://registry.npmjs.org/dependency2/-/dependency2-1.5.2.tgz",             "integrity":  "sha512-WOn21V8AhyE1QqVfPIVxe3tupJacq1xGkPTB4iagT6o+P2cAgEOOwIxMftr4+ZCTI6d551ij9j61DFr0nsP2uQ=="         }     } }

二、package.json常用屬性

本章來聊聊package.json中常用的配置屬性,形如name,version等屬性太過簡單,不一一介紹。本章主要介紹一下script、bin和workspaces屬性。

2.1 script

在npm中使用script標簽來定義腳本,每當制定npm run的時候,就會自動創建一個shell腳本,這里需要注意的是,npm run新建的這個 Shell,會將本地目錄的node_modules/.bin子目錄加入PATH變量。

這意味著,當前目錄的node_modules/.bin子目錄里面的所有腳本,都可以直接用腳本名調用,而不必加上路徑。比如,當前項目的依賴里面有 esbuild,只要直接寫esbuild xxx 就可以了。

{   // ...   "scripts": {     "build": "esbuild index.js",   } }
{   // ...   "scripts": {     "build": "./node_modules/.bin/esbuild index.js"    } }

上面兩種寫法是等價的。

2.2 bin

bin屬性用來將可執行文件加載到全局環境中,指定了bin字段的npm包,一旦在全局安裝,就會被加載到全局環境中,可以通過別名來執行該文件。

比如@bytepack/cli的npm包:

"bin": {     "bytepack": "./bin/index.js"  },

一旦在全局安裝了@bytepack/cli,就可以直接通過bytepack來執行相應的命令,比如

bytepack -v //顯示1.11.0

如果非全局安裝,那么會自動連接到項目的node_module/.bin目錄中。與前面介紹的script標簽中所說的一致,可以直接用別名來使用。

2.3 workspaces

在項目過大的時候,最近越來越流行monorepo。提到monorepo就繞不看workspaces,早期我們會用yarn workspaces,現在npm官方也支持了workspaces. workspaces解決了本地文件系統中如何在一個頂層root package下管理多個子packages的問題,在workspaces聲明目錄下的package會軟鏈到最上層root package的node_modules中。

直接以官網的例子來說明:

{   "name": "my-project",   "workspaces": [     "packages/a"   ] }

在一個npm包名為my-project的npm包中,存在workspaces配置的目錄。

. +-- package.json +-- index.js `-- packages    +-- a    |  `-- package.json

并且該最上層的名為my-project的root包,有packages/a子包。此時,我們如果npm install,那么在root package中node_modules中安裝的npm包a,指向的是本地的package/a.

. +-- node_modules |  `-- packages/a -> ../packages/a +-- package-lock.json +-- package.json `-- packages    +-- a    |   `-- package.json

上述的

-- packages/a -> ../packages/a

指的就是從node_modules中a鏈接到本地npm包的軟鏈

三、package.json環境相關屬性

常見的環境,基本上分為瀏覽器browser和node環境兩大類,接下來我們來看看package.json中,跟環境相關的配置屬性。環境的定義可以簡單理解如下:

  • browser環境:比如存在一些只有在瀏覽器中才會存在的全局變量等,比如window,Document等
  • node環境: npm包的源文件中存在只有在node環境中才會有的一些變量和內置包,內置函數等。

3.1 type

js的模塊化規范包含了commonjs、CMD、UMD、AMD和ES module等,最早先在node中支持的僅僅是commonjs字段,但是從node13.2.0開始后,node正式支持了ES module規范,在package.json中可以通過type字段來聲明npm包遵循的模塊化規范。

//package.json {    name: "some package",    type: "module"||"commonjs"  }

需要注意的是:

  • 不指定type的時候,type的默認值是commonjs,不過建議npm包都指定一下type

  • 當type字段指定值為module則采用ESModule規范

  • 當type字段指定時,目錄下的所有.js后綴結尾的文件,都遵循type所指定的模塊化規范

  • 除了type可以指定模塊化規范外,通過文件的后綴來指定文件所遵循的模塊化規范,以.mjs結尾的文件就是使用的ESModule規范,以.cjs結尾的遵循的是commonjs規范

3.2 main & module & browser

除了type外,package.json中還有main,module和browser 3個字段來定義npm包的入口文件。

  • main : 定義了 npm 包的入口文件,browser 環境和 node 環境均可使用
  • module : 定義 npm 包的 ESM 規范的入口文件,browser 環境和 node – 環境均可使用
  • browser : 定義 npm 包在 browser 環境下的入口文件

我們來看一下這3個字段的使用場景,以及同時存在這3個字段時的優先級。我們假設有一個npm包為demo1,

----- dist    |-- index.browser.js    |-- index.browser.mjs    |-- index.js    |-- index.mjs

其package.json中同時指定了main,module和browser這3個字段,

  "main": "dist/index.js",  // main    "module": "dist/index.mjs", // module    // browser 可定義成和 main/module 字段一一對應的映射對象,也可以直接定義為字符串   "browser": {     "./dist/index.js": "./dist/index.browser.js", // browser+cjs     "./dist/index.mjs": "./dist/index.browser.mjs"  // browser+mjs   },    // "browser": "./dist/index.browser.js" // browser

默認構建和使用,比如我們在項目中引用這個npm包:

import demo from 'demo'

通過構建工具構建上述代碼后,模塊的加載循序為:

browser+mjs > module > browser+cjs > main

這個加載順序是大部分構建工具默認的加載順序,比如webapck、esbuild等等。可以通過相應的配置修改這個加載順序,不過大部分場景,我們還是會遵循默認的加載順序。

3.3 exports

如果在package.json中定義了exports字段,那么這個字段所定義的內容就是該npm包的真實和全部的導出,優先級會高于main和file等字段。

舉例來說:

{   "name": "pkg",   "exports": {     ".": "./main.mjs",     "./foo": "./foo.js"   } }
import { something } from "pkg"; // from "pkg/main.mjs"
const { something } = require("pkg/foo"); // require("pkg/foo.js")

從上述的例子來看,exports可以定義不同path的導出。如果存在exports后,以前正常生效的file目錄到處會失效,比如require('pkg/package.json'),因為在exports中沒有指定,就會報錯。

exports還有一個最大的特點,就是條件引用,比如我們可以根據不同的引用方式或者模塊化類型,來指定npm包引用不同的入口文件。

// package.json {    "name":"pkg",   "main": "./main-require.cjs",   "exports": {     "import": "./main-module.js",     "require": "./main-require.cjs"   },   "type": "module" }

上述的例子中,如果我們通過

const p = require('pkg')

引用的就是"./main-require.cjs"。

如果通過:

import p from 'pkg'

引用的就是"./main-module.js"

最后需要注意的是 :如果存在exports屬性,exports屬性不僅優先級高于main,同時也高于module和browser字段。

三、package.json依賴相關屬性

package.json中跟依賴相關的配置屬性包含了dependencies、devDependencies、peerDependencies和peerDependenciesMeta等。

dependencies是項目的依賴,而devDependencies是開發所需要的模塊,所以我們可以在開發過程中需要的安裝上去,來提高我們的開發效率。這里需要注意的時,在自己的項目中盡量的規范使用,形如webpack、babel等是開發依賴,而不是項目本身的依賴,不要放在dependencies中。

dependencies除了dependencies和devDependencies,本文重點介紹的是peerDependencies和peerDependenciesMeta。

3.1 peerDependencies

peerDependencies是package.json中的依賴項,可以解決核心庫被下載多次,以及統一核心庫版本的問題。

//package/pkg ----- node_modules    |-- npm-a -> 依賴了react,react-dom    |-- npm-b -> 依賴了react,react-dom    |-- index.js

比如上述的例子中如果子npm包a,b都以來了react和react-dom,此時如果我們在子npm包a,b的package.json中聲明了PeerDependicies后,相應的依賴就不會重新安裝。

需要注意的有兩點:

  • 對于子npm包a,在npm7中,如果單獨安裝子npm a,其peerDependicies中的包,會被安裝下來。但是npm7之前是不會的。
  • 請規范和詳細的指定PeerDependicies的配置,筆者在看到有些react組件庫,不在PeerDependicies中指定react和react-dom,或者將react和react-dom放到了dependicies中,這兩種不規范的指定都會存在一些問題。
  • 其二,正確的指定PeerDependicies中npm包的版本,react-focus-lock@2.8.1,peerDependicies指定的是:"react": "^16.8.0 || ^17.0.0 || ^18.0.0",但實際上,這個react-focus-lock并不支持18.x的react

3.2 peerDependenciesMeta

看到“Meta”就有元數據的意思,這里的peerDependenciesMeta就是詳細修飾了peerDependicies,比如在react-redux這個npm包中的package.json中有這么一段:

 "peerDependencies": {     "react": "^16.8.3 || ^17 || ^18"   },  "peerDependenciesMeta": {     "react-dom": {       "optional": true     },     "react-native": {       "optional": true     }   }

這里指定了"react-dom","react-native"在peerDependenciesMeta中,且為可選項,因此如果項目中檢測沒有安裝"react-dom"和"react-native"都不會報錯。

值得注意的是,通過peerDependenciesMeta我們確實是取消了限制,但是這里經常存在非A即B的場景,比如上述例子中,我們需要的是“react-dom”和"react-native"需要安裝一個,但是實際上通過上述的聲明,我們實現不了這種提示。

四、package.json三方屬性

package.json中也存在很多三方屬性,比如tsc中使用的types、構建工具中使用的sideEffects,git中使用的husky,eslint使用的eslintIgnore,這些擴展的配置,針對特定的開發工具是有意義的這里不一一舉例。

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
亚洲网中文字幕| 最新av在线免费观看| www.亚洲视频.com| av在线免费观看国产| 日本阿v视频在线观看| 91 视频免费观看| 天天色综合社区| www.午夜av| 999久久久精品视频| 一本一道久久a久久综合蜜桃| 人人干人人干人人| 一级黄色香蕉视频| 裸体裸乳免费看| 国产日韩第一页| 成年人视频在线免费| av动漫免费观看| 国产96在线 | 亚洲| 爱情岛论坛亚洲首页入口章节| 爱豆国产剧免费观看大全剧苏畅| 国产一级特黄a大片免费| 免费一级特黄录像| 日本免费色视频| 成人中文字幕在线播放| 无套内谢丰满少妇中文字幕| 奇米精品一区二区三区| aa在线观看视频| 欧美伦理片在线看| 日本免费色视频| 欧美人与动牲交xxxxbbbb| 国产精品动漫网站| 成人综合久久网| 91精品国产91久久久久麻豆 主演| 中文字幕成人在线视频| 日韩 欧美 自拍| jizzjizzxxxx| 国产 日韩 亚洲 欧美| 成人中文字幕在线播放| 狠狠干狠狠操视频| 国产老熟妇精品观看| 天天综合网久久| 99在线精品免费视频 | 亚洲男人天堂色| 久久久天堂国产精品| 9久久婷婷国产综合精品性色 | 波多野结衣三级在线| 久久视频这里有精品| 亚洲精品第三页| 免费av手机在线观看| 拔插拔插华人永久免费| 欧美日韩中文在线视频| 国产av天堂无码一区二区三区| 别急慢慢来1978如如2| 可以在线看的av网站| 黄瓜视频免费观看在线观看www | 一二三四中文字幕| 欧美在线aaa| 大香煮伊手机一区| 玩弄japan白嫩少妇hd| 久久久久久久免费视频| 日本中文字幕精品—区二区| 一本色道无码道dvd在线观看| 91国在线高清视频| 伊人精品视频在线观看| www.日本一区| 老司机午夜av| 成人午夜视频免费在线观看| 久在线观看视频| 波多野结衣50连登视频| 精品少妇一区二区三区在线| 国产美女永久无遮挡| 国产精品无码电影在线观看| 最新av网址在线观看| 麻豆视频传媒入口| www.黄色网址.com| 欧美一级黄色录像片| 99热这里只有精品免费| 亚洲 欧美 日韩 国产综合 在线| 99久热在线精品视频| 成人在线国产视频| 国产毛片视频网站| 日韩中文字幕在线视频观看| 成人免费aaa| 欧美日韩怡红院| 911福利视频| 国产精品第157页| 日韩欧美一区三区| 精品久久久噜噜噜噜久久图片| 那种视频在线观看| 日韩中文字幕a| 日韩一区二区高清视频| 日韩欧美一区三区| 五月婷婷之婷婷| 波多野结衣av一区二区全免费观看 | 中文字幕第36页| www.桃色.com| 丝袜人妻一区二区三区| 国产日韩成人内射视频| 午夜激情影院在线观看| 国产资源在线免费观看| 韩国日本美国免费毛片| 欧美做受777cos| 精品久久久久久中文字幕2017| 国产aⅴ爽av久久久久| 人妻av无码专区| 久久国产精品国产精品| 成人午夜视频在线观看免费| 久久久国产欧美| 欧美日韩性生活片| 日韩欧美中文在线视频| 高清欧美精品xxxxx| 亚洲色图偷拍视频| 国产精品欧美激情在线观看| 小说区视频区图片区| 精品日韩久久久| 日韩在线综合网| 欧美 国产 精品| 国产精品一区二区小说| 妺妺窝人体色www在线小说| 国风产精品一区二区| 99热这里只有精品在线播放| 黄色片网址在线观看| 激情视频小说图片| 日本高清免费在线视频| 亚洲性生活网站| 十八禁视频网站在线观看| 免费看欧美黑人毛片| 欧美日韩视频免费在线观看| 国产精品一区二区小说| 欧美性猛交久久久乱大交小说| 免费看欧美黑人毛片| 激情视频小说图片| 99亚洲精品视频| 日本一道在线观看| 国产999免费视频| 伊人成人免费视频| 久久精品亚洲天堂| 亚洲国产精品影视| 性生活免费观看视频| 黄色www在线观看| 日韩成人三级视频| 国产一区 在线播放| 777av视频| 久久久久人妻精品一区三寸| 99re在线视频免费观看| 日韩精品一区二区三区不卡 | 三级黄色片免费看| 超碰成人在线播放| 午夜视频在线观| 黄色一级大片免费| 水蜜桃色314在线观看| 人妻少妇被粗大爽9797pw| www.国产区| 欧美一级视频在线| 久久福利一区二区| 国产3p露脸普通话对白| 9久久婷婷国产综合精品性色| 不卡中文字幕在线观看| 穿情趣内衣被c到高潮视频| 欧美国产视频一区| www黄色在线| 国产999免费视频| 国产亚洲综合视频| 亚洲免费999| 99久热在线精品视频| 黄色国产小视频| 一级片黄色免费| 欧美牲交a欧美牲交aⅴ免费真 | 中文字幕精品一区二区三区在线| 成人在线免费观看网址| 97在线免费公开视频| 黄色一级片网址| jizzjizzxxxx| 国产又粗又猛又爽又黄的网站| 成人黄色一区二区| 午夜啪啪免费视频| 日韩网址在线观看| www.一区二区.com| 日韩va在线观看| 黄色片久久久久| wwwwww欧美| 国产在线观看中文字幕| 欧美 激情 在线| 欧美图片激情小说| 裸体大乳女做爰69| 色戒在线免费观看| www一区二区www免费| 亚洲五码在线观看视频| 超碰人人草人人| 成人免费在线观看视频网站| 欧美视频在线免费播放| 国产在线视频综合| 看一级黄色录像| 久久精品国产99久久99久久久| 成人三级视频在线播放| 欧美日本视频在线观看| 好吊妞无缓冲视频观看| 又粗又黑又大的吊av| 男女超爽视频免费播放| 国产视频在线观看网站| 精品人妻人人做人人爽|