หลักสูตรเริ่มต้นสู่การเรียนรู้ส่วนหน้า (vue): การเข้าสู่การเรียนรู้
ทุกวันนี้ นักเรียนที่พัฒนาส่วนหน้าไม่สามารถทำได้หากไม่มี npm
ซึ่งเป็นเครื่องมือการจัดการแพ็คเกจที่ยอดเยี่ยม กลไกการจัดการเวอร์ชันแพ็คเกจที่ยอดเยี่ยมนำพาชุมชน NodeJS
ที่เจริญรุ่งเรืองทั้งหมด เพื่อทำความเข้าใจกลไกภายใน ช่วยให้เข้าใจการพัฒนาโมดูลและการกำหนดค่าทางวิศวกรรมส่วนหน้าให้ลึกซึ้งยิ่งขึ้นเพื่อเร่งการแก้ไขปัญหาของเรา (ฉันเชื่อว่านักเรียนหลายคนประสบปัญหาการพึ่งพาต่างๆ)
บทความนี้ดำเนินการวิเคราะห์โดยละเอียดเกี่ยวกับกลไกการจัดการแพ็กเกจของ npm
จากสามมุมมอง: package.json
การจัดการเวอร์ชัน การติดตั้งการขึ้นต่อกัน และตัวอย่างเฉพาะ
ใน Node.js
โมดูลคือไลบรารีหรือเฟรมเวิร์กและยังเป็นโปรเจ็กต์ Node.js
โปรเจ็กต์ Node.js
เป็นไปตามสถาปัตยกรรมแบบโมดูลาร์ เมื่อเราสร้างโปรเจ็กต์ Node.js
นั่นหมายถึงการสร้างโมดูลนี้จะต้องมีไฟล์คำอธิบาย ซึ่งก็คือ package.json
มันเป็นไฟล์การกำหนดค่าที่พบบ่อยที่สุดของเรา แต่คุณเข้าใจรายละเอียดการกำหนดค่าโดยละเอียดหรือไม่? การกำหนดค่าไฟล์ package.json
ที่สมเหตุสมผลจะกำหนดคุณภาพของโปรเจ็กต์ของเราโดยตรง ดังนั้นก่อนอื่นเราจะวิเคราะห์การกำหนดค่าโดยละเอียดของ package.json
มีคุณลักษณะมากมายใน package.json
ซึ่งต้องกรอกเพียงสองรายการ: name
และ version
คุณลักษณะทั้งสองนี้สร้างตัวระบุเฉพาะของโมดูล npm
name
ชื่อโมดูล เมื่อตั้งชื่อคุณต้องปฏิบัติตามข้อกำหนดและคำแนะนำอย่างเป็นทางการ:
ชื่อแพ็คเกจจะกลายเป็นพารามิเตอร์ใน url
ของโมดูล บรรทัดคำสั่ง หรือชื่อโฟลเดอร์ใด ๆ ที่ไม่ใช่ url
ที่ปลอดภัย อยู่ในชื่อแพ็คเกจ ไม่สามารถใช้ได้ คุณสามารถใช้แพ็คเกจ validate-npm-package-name
เพื่อตรวจสอบว่าชื่อแพ็คเกจนั้นถูกกฎหมายหรือไม่
ชื่อแพ็คเกจความหมายสามารถช่วยให้นักพัฒนาค้นหาแพ็คเกจที่ต้องการได้เร็วขึ้น และหลีกเลี่ยงการได้รับแพ็คเกจที่ไม่ถูกต้องโดยไม่ตั้งใจ
หากมีสัญลักษณ์บางตัวในชื่อแพ็คเกจ จะต้องไม่ซ้ำสัญลักษณ์กับชื่อแพ็คเกจที่มีอยู่หลังจากลบออกแล้ว
ตัวอย่างเช่น เนื่องจากมี react-native
อยู่แล้ว ดังนั้น react.native
และ reactnative
จึงไม่สามารถสร้างใหม่ได้
ตัวอย่างเช่น: ชื่อผู้ใช้คือ conard
จากนั้นขอบเขตคือ @conard
และแพ็คเกจที่เผยแพร่อาจเป็น @conard/react
name
เป็นตัวระบุเฉพาะของแพ็กเกจ และต้องไม่ซ้ำกับชื่อแพ็กเกจอื่น เราสามารถดำเนินการ npm view packageName
เพื่อดูว่าแพ็กเกจถูกครอบครองหรือไม่ และเราสามารถดูข้อมูลพื้นฐานบางอย่างเกี่ยวกับแพ็คเกจนั้นได้:
หากไม่เคยใช้ชื่อแพ็คเกจ ข้อผิดพลาด 404
จะถูกส่งออกไป:
นอกจากนี้คุณยังสามารถไปที่ https://www.npmjs.com/
เพื่อดูข้อมูลแพ็คเกจโดยละเอียดเพิ่มเติม
{ "description": "ภาษาการออกแบบ UI ระดับองค์กรและการใช้งานส่วนประกอบ React", "คำสำคัญ": [ "มด", "ส่วนประกอบ", "ส่วนประกอบ", "ออกแบบ", "กรอบ", "ส่วนหน้า", "ตอบสนอง", "ส่วนประกอบปฏิกิริยา", "อุ้ย" - }
description
ใช้เพื่อเพิ่มข้อมูลคำอธิบายโมดูลเพื่ออำนวยความสะดวกให้ผู้อื่นเข้าใจโมดูลของคุณ
keywords
ใช้เพื่อเพิ่มคำหลักในโมดูลของคุณ
แน่นอนว่าพวกมันยังมีบทบาทสำคัญมากเช่นกัน ซึ่งก็คือการอำนวยความสะดวกในการดึงข้อมูลโมดูล เมื่อคุณใช้ npm search
เพื่อดึงข้อมูลโมดูล โมดูลจะจับคู่ description
และ keywords
การเขียน description
และ keywords
ที่ดีจะช่วยให้โมดูลของคุณได้รับการเปิดเผยที่แม่นยำยิ่งขึ้น:
ในการอธิบายนักพัฒนา: author
และ contributors
author
หมายถึงผู้เขียนหลักของแพ็คเกจ และ author
หนึ่งคนหมายถึงบุคคลหนึ่งคน
ข้อมูล
contributors
contributors
สอดคล้องกับผู้มีส่วนร่วมหลายคน ค่าเป็นอาร์เรย์
"ชื่อ" : "โคนาร์ดลี", "อีเมล" : "[email protected]", "url" : "https://github.com/ConardLi" }
{ "homepage": "http://ant.design/", "ข้อบกพร่อง": { "url": "https://github.com/ant-design/ant-design/issues" - "พื้นที่เก็บข้อมูล": { "type": "git", "url": "https://github.com/ant-design/ant-design" - }
homepage
ใช้เพื่อระบุหน้าแรกของโมดูลนี้
repository
ใช้เพื่อระบุที่เก็บโค้ดของโมดูล
bugs
ระบุที่อยู่หรืออีเมลที่ผู้ที่มีคำถามเกี่ยวกับโมดูลของคุณสามารถไปที่นี่เพื่อถามคำถาม
โครงการของเราอาจขึ้นอยู่กับแพ็คเกจการพึ่งพาภายนอกตั้งแต่หนึ่งแพ็คเกจขึ้นไป เรากำหนดค่าแพ็คเกจเหล่านั้นภายใต้แอตทริบิวต์ต่อไปนี้: dependencies、devDependencies、peerDependencies、bundledDependencies、optionalDependencies
ก่อนที่จะแนะนำการกำหนดค่าการขึ้นต่อกันหลายรายการ ขั้นแรกเรามาดูกฎการกำหนดค่าการขึ้นต่อกันกันก่อน การกำหนดค่าแพ็คเกจการขึ้นต่อกันที่คุณเห็นอาจเป็นดังนี้:
"การขึ้นต่อกัน": { "antd": "การออกแบบมด/การออกแบบมด#4.0.0-alpha.8", "axios": "^1.2.0", "test-js": "ไฟล์:../test", "test2-js": "http://cdn.com/test2-js.tar.gz", "core-js": "^1.1.5", }
การกำหนดค่าการพึ่งพาเป็นไปตามกฎการกำหนดค่าต่อไปนี้:
依赖包名称:VERSION
VERSION
คือการกำหนดค่าหมายเลขเวอร์ชันที่เป็นไปตามข้อกำหนด SemVer
เมื่อ npm install
มันจะไปที่เซิร์ฟเวอร์ npm เพื่อดาวน์โหลดแพ็คเกจที่ตรงตามช่วงเวอร์ชันที่ระบุ依赖包名称:DWONLOAD_URL
DWONLOAD_URL
คือที่อยู่แพ็คเกจบีบอัด tarball
ที่ดาวน์โหลดได้ เมื่อติดตั้งโมดูลแล้ว . .tar
นี้จะถูกดาวน์โหลดและติดตั้งในเครื่อง依赖包名称:LOCAL_PATH
LOCAL_PATH
คือพาธของแพ็กเกจการขึ้นต่อกันในเครื่อง เช่น file:../pacakges/pkgName
เหมาะสำหรับคุณที่จะทดสอบแพ็คเกจ npm
ในเครื่อง ไม่ควรใช้วิธีนี้ทางออนไลน์依赖包名称:GITHUB_URL
GITHUB_URL
เป็นวิธีการเขียน username/modulename
ของ github
เช่น: ant-design/ant-design
คุณยังสามารถระบุ tag
และ commit id
ในภายหลังได้依赖包名称:GIT_URL
GIT_URL
คือ git url
ของฐานรหัสโคลนปกติของเรา ซึ่งเป็นไปตามรูปแบบต่อไปนี้:<protocol>://[<user>[:<password>]@]<hostname>[:<port>] [: ][/]<path>[#<commit-ish> |. #semver:<semver>]
protocal
สามารถอยู่ในรูปแบบต่อไปนี้:
git://github.com/user/project.git#commit-ish
git+ssh://user@hostname:project.git#commit-ish
git+ssh://user@hostname/project.git#commit-ish
git+http://user@hostname/project/blah.git#commit-ish
git+https://user@hostname/project/blah.git#commit-ish
dependencies
โมดูลที่โปรเจ็กต์ต้องพึ่งพา สามารถกำหนดค่าทั้งสภาพแวดล้อมการพัฒนาและโมดูลการพึ่งพาสภาพแวดล้อมการใช้งานจริงได้ที่นี่ เช่น
" การอ้างอิง": { "lodash": "^4.17.13", "ช่วงเวลา": "^2.24.0", }มีแพ็คเกจบางอย่างใน
ที่คุณสามารถใช้ในสภาพแวดล้อมการพัฒนาเท่านั้น เช่น eslint
สำหรับตรวจสอบข้อกำหนดโค้ดและ jest
สำหรับการทดสอบ เมื่อผู้ใช้ใช้แพ็คเกจของคุณ มันสามารถทำงานได้ตามปกติแม้ว่าจะไม่ได้ติดตั้งการขึ้นต่อกันเหล่านี้ก็ตาม จะใช้เวลาและทรัพยากรมากขึ้น ดังนั้นคุณสามารถเพิ่มการขึ้นต่อกันเหล่านี้ให้กับ devDependencies
ได้ การขึ้นต่อกันเหล่านี้จะยังคงได้รับการติดตั้งและจัดการเมื่อคุณดำเนินการ npm install
ในเครื่อง แต่จะไม่ถูกติดตั้งลงในสภาพแวดล้อมการใช้งานจริง:
"devDependencies" : { "ตลก": "^24.3.1", "eslint": "^6.1.0", }
peerDependencies
ใช้เพื่อระบุเวอร์ชันที่โมดูลที่คุณกำลังพัฒนานั้นขึ้นอยู่กับและความเข้ากันได้ของเวอร์ชันแพ็คเกจที่ขึ้นอยู่กับการติดตั้งโดยผู้ใช้
ข้อความข้างต้นอาจเป็นนามธรรมเกินไป มาดูตัวอย่าง package.json
ของ ant-design
ant-design
กัน:
"peerDependencies": { "โต้ตอบ": ">=16.0.0", "react-dom": ">=16.0.0" }
เมื่อคุณกำลังพัฒนาระบบและใช้ ant-design
คุณจะต้องพึ่งพา React
อย่างแน่นอน ในเวลาเดียวกัน ant-design
ยังต้องพึ่งพา React
เวอร์ชัน React
ที่ต้องการเพื่อรักษาการทำงานที่เสถียรคือ 16.0.0
และเวอร์ชัน React
ที่คุณใช้เมื่อพัฒนาคือ 15.x
:
ในขณะนี้ ant-design
จำเป็นต้องใช้ React
และนำเข้า:
import * as React from 'react'; import * เป็น ReactDOM จาก 'react-dom'
สิ่งที่คุณได้รับในขณะนี้คือสภาพแวดล้อมของโฮสต์ ซึ่งเป็นเวอร์ชัน React
ในสภาพแวดล้อมของคุณ ซึ่งอาจทำให้เกิดปัญหาบางอย่างได้ ใน npm2
การระบุ peerDependencies
ด้านบนจะหมายถึงการบังคับให้สภาพแวดล้อมโฮสต์ติดตั้งเวอร์ชันของ react@>=16.0.0和react-dom@>=16.0.0
ในอนาคต npm3
จะไม่จำเป็นต้องมีแพ็คเกจการพึ่งพาที่ระบุโดย peerDependencies
อีกต่อไป ในทางกลับกัน npm3
จะตรวจสอบว่าการติดตั้งถูกต้องหรือไม่หลังจากการติดตั้งเสร็จสมบูรณ์ หากไม่ถูกต้อง จะมีการพิมพ์คำเตือนไปยังผู้ใช้ .
"การอ้างอิง": { "ตอบสนอง": "15.6.0", "antd": "^3.22.0"ตัวอย่าง
เช่น
ฉันใช้ antd
เวอร์ชันล่าสุดในโปรเจ็กต์ จากนั้นจึงใช้ react
เวอร์ชัน 15.6.0
คำเตือนต่อไปนี้จะได้รับเมื่อติดตั้งการขึ้นต่อกัน:
ในบางสถานการณ์ แพ็คเกจที่ต้องพึ่งพาอาจไม่มีการพึ่งพาที่แข็งแกร่ง ฟังก์ชันของแพ็คเกจที่ต้องพึ่งพานี้สามารถแจกจ่ายได้ เมื่อไม่สามารถรับแพ็คเกจที่ต้องพึ่งพานี้ได้ คุณต้องการให้ npm install
ทำงานต่อไปโดยไม่ทำให้เกิดความล้มเหลว คุณสามารถวางการพึ่งพานี้ได้ optionalDependencies
โปรดทราบว่าการกำหนดค่าใน optionalDependencies
จะแทนที่ dependencies
ดังนั้นจึงจำเป็นต้องกำหนดค่าในที่เดียวเท่านั้น
แน่นอน เมื่ออ้างอิงการอ้างอิงที่ติดตั้งใน optionalDependencies
จะต้องจัดการข้อยกเว้น มิฉะนั้นข้อผิดพลาดจะถูกรายงานเมื่อไม่สามารถรับโมดูลได้
แตกต่างจากค่าข้างต้น ค่าของ bundledDependencies
คืออาร์เรย์ บางโมดูลสามารถระบุได้ในอาร์เรย์
"bundledDependencies": ["แพ็คเกจ 1", "แพ็คเกจ 2"]
{ "ใบอนุญาต": "เอ็มไอที" }
ช่อง license
ใช้เพื่อระบุข้อตกลงโอเพ่นซอร์สของซอฟต์แวร์ ข้อตกลงโอเพ่นซอร์สให้รายละเอียดเกี่ยวกับสิทธิ์ที่ผู้อื่นมีหลังจากได้รับรหัสของคุณ การดำเนินการใดที่พวกเขาสามารถทำได้กับโค้ดของคุณ และการดำเนินการใดที่ไม่ได้รับอนุญาต ข้อตกลงเดียวกันมีหลายรูปแบบ ข้อตกลงที่หลวมเกินไปจะทำให้ผู้เขียนสูญเสียสิทธิ์ในการทำงานจำนวนมาก ในขณะที่ข้อตกลงที่เข้มงวดเกินไปจะไม่สะดวกสำหรับผู้ใช้ในการเผยแพร่ผลงาน ผู้เขียนโอเพ่นซอร์สจะต้องพิจารณาว่าพวกเขาต้องการรักษาสิทธิ์ใดบ้าง และต้องการคลายข้อจำกัดใด
ข้อตกลงซอฟต์แวร์สามารถแบ่งออกเป็นสองประเภท: โอเพ่นซอร์สและเชิงพาณิชย์ สำหรับข้อตกลงทางการค้าหรือที่เรียกว่าคำชี้แจงทางกฎหมายและข้อตกลงใบอนุญาต แต่ละซอฟต์แวร์จะมีชุดข้อความของตัวเองซึ่งเขียนโดยผู้เขียนซอฟต์แวร์หรือทนายความเฉพาะทาง ไม่จำเป็นต้องดำเนินการด้วยตนเอง ใช้เวลาและความพยายามในการเขียนข้อตกลงใบอนุญาตที่ยาวนาน การเลือกใบอนุญาตโอเพ่นซอร์สที่เผยแพร่อย่างกว้างขวางเป็นทางเลือกที่ดี
ต่อไปนี้เป็นโปรโตคอลโอเพ่นซอร์สกระแสหลักหลายประการ:
MIT
: ตราบใดที่ผู้ใช้รวมประกาศลิขสิทธิ์และประกาศใบอนุญาตไว้ในสำเนาของโครงการ พวกเขาสามารถทำทุกอย่างที่ต้องการด้วยโค้ดของคุณโดยไม่ต้องรับผิดชอบในส่วนของคุณApache
: คล้ายกับ MIT
แต่ยังรวมคำศัพท์ที่เกี่ยวข้องกับการออกใบอนุญาตสิทธิบัตรที่จัดทำโดยผู้มีส่วนร่วมในผู้ใช้GPL
: ผู้ใช้ที่แก้ไขรหัสโครงการจะต้องเผยแพร่การแก้ไขที่เกี่ยวข้องเมื่อแจกจ่ายซอร์สโค้ดหรือรหัสไบนารี่อีกครั้งหากคุณมีข้อกำหนดโดยละเอียดเพิ่มเติมสำหรับข้อตกลงโอเพ่นซอร์ส คุณสามารถไปที่ choosealicense.com/ เพื่อดูคำอธิบายโดยละเอียดเพิ่มเติมของข้อตกลงโอเพ่นซอร์ส
1.5{ "main": "lib/index.js", }
คุณลักษณะ main
สามารถระบุไฟล์รายการหลักของโปรแกรมได้ ตัวอย่างเช่น รายการโมดูล lib/index.js
ที่ระบุโดย antd
ข้างต้น เมื่อเราแนะนำ antd
ในโค้ด: import { notification } from 'antd';
สิ่งที่แนะนำคือ lib/index.js
เมื่อโมดูลของคุณเป็นเครื่องมือบรรทัดคำสั่ง คุณต้องระบุรายการสำหรับเครื่องมือบรรทัดคำสั่ง นั่นคือ ระบุความสอดคล้องระหว่างชื่อคำสั่งของคุณกับไฟล์ที่ระบุในเครื่อง หากติดตั้งแบบโกลบอล npm จะใช้ลิงก์สัญลักษณ์เพื่อลิงก์ไฟล์ปฏิบัติการกับ /usr/local/bin
หากติดตั้งแบบโลคัล ไฟล์นั้นจะลิงก์ไปยัง ./node_modules/.bin/
- "ถังขยะ": { "conard": "./bin/index.js" - }
ตัวอย่างเช่น การกำหนดค่าข้างต้น: เมื่อแพ็คเกจของคุณถูกติดตั้งทั่วโลก: npm
จะสร้างซอฟต์ลิงก์ชื่อ conard
ภายใต้ /usr/local/bin
โดยชี้ไปที่ "./bin/index.js"
. ในเวลานี้ หากคุณดำเนินการ conard
บนบรรทัดคำสั่ง ไฟล์ js ที่เชื่อมโยงจะถูกเรียก
ฉันจะไม่ลงรายละเอียดมากเกินไปที่นี่ เนื้อหาเพิ่มเติมจะมีการอธิบายโดยละเอียดในบทความเครื่องมือบรรทัดคำสั่งถัดไปของฉัน
{ "ไฟล์": [ "ระยะทาง", "ลิบ", "เอส" - }
แอตทริบิวต์ files
ใช้เพื่ออธิบายรายการไฟล์ที่คุณพุชไปยังเซิร์ฟเวอร์ npm
หลังจาก npm publish
หากคุณระบุโฟลเดอร์ เนื้อหาทั้งหมดในโฟลเดอร์จะถูกรวมไว้ด้วย เราจะเห็นว่าแพ็คเกจที่ดาวน์โหลดมีโครงสร้างไดเร็กทอรีดังต่อไปนี้:
นอกจากนี้ คุณยังสามารถกำหนดค่าไฟล์
.npmignore
เพื่อยกเว้นบางไฟล์เพื่อป้องกันไม่ให้ไฟล์ขยะจำนวนมากถูกพุชไปที่npm
กฎจะเหมือนกับ.gitignore
ที่คุณใช้ ไฟล์.gitignore
ยังสามารถทำหน้าที่เป็นไฟล์.npmignore
ได้อีกด้วย
man
สั่ง man
เป็นคำสั่งช่วยเหลือภายใต้ Linux
คุณสามารถดูวิธีใช้คำสั่ง วิธีใช้ไฟล์การกำหนดค่า วิธีใช้การเขียนโปรแกรม และข้อมูลอื่น ๆ ใน Linux
ได้
หากโมดูล node.js
ของคุณเป็นเครื่องมือบรรทัดคำสั่งส่วนกลาง คุณสามารถระบุที่อยู่เอกสารที่ค้นหาโดยคำสั่ง man
ผ่านแอตทริบิวต์ man
ใน package.json
ไฟล์ man
ต้องลงท้ายด้วยตัวเลข หรือหากบีบอัด .gz
ตัวเลขระบุว่าไฟล์จะถูกติดตั้งในส่วนใดของ man
หากชื่อไฟล์ man
ไม่ได้ขึ้นต้นด้วยชื่อโมดูล ชื่อโมดูลจะถูกนำหน้าระหว่างการติดตั้ง
ตัวอย่างเช่น การกำหนดค่าต่อไปนี้:
{ "ผู้ชาย" : [ "/Users/isaacs/dev/npm/cli/man/man1/npm-access.1", "/Users/isaacs/dev/npm/cli/man/man1/npm-audit.1" - }
ป้อน man npm-audit
บนบรรทัดคำสั่ง:
โมดูล node.js
ถูกนำไปใช้ตามข้อกำหนดคุณสมบัติโมดูลาร์ CommonJS
เพื่อให้สอดคล้องกับข้อกำหนด CommonJS
อย่างเคร่งครัด นอกเหนือจากไฟล์คำอธิบายแพ็กเกจ package.json
แล้ว ไดเร็กทอรีโมดูลยังจำเป็นต้องมีไดเร็กทอรีต่อไปนี้:
bin
: โดยที่ ไฟล์ไบนารีที่ปฏิบัติการได้จะถูกจัดเก็บ Directorylib
: Directory สำหรับจัดเก็บโค้ด jsdoc
: Directory สำหรับจัดเก็บเอกสารtest
: Directory สำหรับจัดเก็บโค้ดกรณีทดสอบหน่วยในไดเร็กทอรีโมดูล คุณอาจไม่ปฏิบัติตามโครงสร้างด้านบนอย่างเคร่งครัดเพื่อจัดระเบียบหรือตั้งชื่อ คุณสามารถระบุ directories
ในคุณสมบัติ package.json
เพื่อระบุว่าโครงสร้างไดเร็กทอรีของคุณสอดคล้องกับโครงสร้าง Canonical ข้างต้นอย่างไร นอกเหนือจากนี้ แอตทริบิวต์ directories
ยังไม่มีแอปพลิเคชันอื่นในขณะนี้
- "ไดเรกทอรี": { "lib": "src/lib/", "bin": "src/bin/", "man": "src/man/", "doc": "src/doc/", "ตัวอย่าง": "src/ตัวอย่าง/" - อย่างไรก็ตาม
เอกสารอย่างเป็นทางการระบุว่าแม้ว่าแอตทริบิวต์นี้จะไม่มีบทบาทสำคัญในปัจจุบัน แต่เทคนิคบางอย่างอาจได้รับการพัฒนาในอนาคต ตัวอย่างเช่น ไฟล์มาร์กดาวน์ที่จัดเก็บไว้ใน doc และไฟล์ตัวอย่างที่จัดเก็บไว้ในตัวอย่างอาจแสดงในลักษณะที่เป็นมิตร
{ "สคริปต์": { "test": "jest --config .jest.js --no-cache", "dist": "antd-tools ทำงาน dist", "compile": "antd-tools เรียกใช้การคอมไพล์", "build": "การรัน npm คอมไพล์ && npm run dist" - }
scripts
ใช้เพื่อกำหนดค่าตัวย่อของคำสั่งสคริปต์บางคำสั่ง สามารถใช้ npm run command
ร่วมกันได้ หากเป็นคีย์เวิร์ด npm
ก็สามารถเรียกได้โดยตรง ตัวอย่างเช่น การกำหนดค่าข้างต้นระบุคำสั่งต่อไปนี้: npm run test
, npm run dist
, npm run compile
, npm run build
ฟิลด์ config
ใช้เพื่อกำหนดค่าตัวแปรสภาพแวดล้อมที่ใช้ในสคริปต์ ตัวอย่างเช่น การกำหนดค่าต่อไปนี้สามารถรับได้โดยใช้ process.env.npm_package_config_port
ในสคริปต์
- "config" : { "พอร์ต" : "8080" } }
หากโมดูล node.js
ของคุณใช้เพื่อติดตั้งเครื่องมือบรรทัดคำสั่งส่วนกลางเป็นหลัก ค่านี้จะถูกตั้งค่าเป็น true
และผู้ใช้จะได้รับคำเตือนเมื่อติดตั้งโมดูลในเครื่อง การกำหนดค่านี้จะไม่ป้องกันผู้ใช้จากการติดตั้ง แต่จะแจ้งให้ผู้ใช้ป้องกันการใช้งานที่ไม่ถูกต้องซึ่งอาจทำให้เกิดปัญหาบางอย่าง
หากตั้งค่าแอตทริบิวต์ private
เป็น true
npm จะปฏิเสธที่จะเผยแพร่ นี่เป็นการป้องกันไม่ให้โมดูลส่วนตัวถูกเผยแพร่โดยไม่ได้ตั้งใจ
"publishConfig": { "รีจิสทรี": "https://registry.npmjs.org/" }
ซึ่งเป็นการกำหนดค่าที่มีรายละเอียดมากขึ้นเมื่อเผยแพร่โมดูล เช่น คุณสามารถกำหนดค่าให้เผยแพร่เฉพาะ tag
บางแท็ก กำหนดค่าแหล่งที่มา npm
ส่วนตัวที่จะเผยแพร่ไป
การกำหนดค่าโดยละเอียดเพิ่มเติม โปรดดูที่
หากคุณพัฒนาโมดูลที่สามารถทำงานได้ภายใต้ระบบ darwin
เท่านั้น คุณต้องแน่ใจว่าผู้ใช้ windows
จะไม่ติดตั้งโมดูลของคุณเพื่อหลีกเลี่ยงข้อผิดพลาดที่ไม่จำเป็น
การใช้แอตทริบิวต์ os
สามารถช่วยให้คุณบรรลุข้อกำหนดข้างต้นได้ คุณสามารถระบุได้ว่าโมดูลของคุณสามารถติดตั้งได้บนบางระบบเท่านั้น หรือระบุบัญชีดำของระบบที่ไม่สามารถติดตั้งได้:
"os" : [ "darwin", "linux" ] "os" : [ "!win32" ]
ตัวอย่างเช่น ฉันกำหนดโมดูลทดสอบให้กับบัญชีดำของระบบ: "os" : [ "!darwin" ]
เมื่อฉันติดตั้งภายใต้ระบบนี้ ข้อผิดพลาดต่อไปนี้จะปรากฏขึ้น:
ในสภาพแวดล้อมของโหนด คุณสามารถใช้ process.platform เพื่อกำหนดระบบปฏิบัติการได้
คล้ายกับ os
ข้างต้น เราสามารถใช้แอตทริบิวต์ cpu
เพื่อจำกัดสภาพแวดล้อมการติดตั้งของผู้ใช้ได้แม่นยำยิ่งขึ้น:
"cpu" : [ "x64", "ia32" ] "cpu" : [ "!arm", "!mips" ]
ในสภาพแวดล้อมของโหนด คุณสามารถใช้ process.arch เพื่อกำหนดสถาปัตยกรรม CPU ได้
ความสำเร็จของ Nodejs
ไม่สามารถแยกออกจากระบบการจัดการการพึ่งพาที่ยอดเยี่ยมของ npm
ก่อนที่จะแนะนำระบบการขึ้นต่อกันทั้งหมด คุณต้องเข้าใจว่า npm
จัดการเวอร์ชันของแพ็คเกจที่ต้องพึ่งพาอย่างไร บทนี้จะแนะนำข้อมูลจำเพาะเวอร์ชันรีลีสของ npm包
วิธีจัดการเวอร์ชันของแพ็คเกจที่ต้องพึ่งพาต่างๆ และแนวทางปฏิบัติที่ดีที่สุดบางประการเกี่ยวกับเวอร์ชันแพ็คเกจ
คุณสามารถเรียกใช้ npm view package version
เพื่อดูเวอร์ชันล่าสุดของ package
ดำเนินการเวอร์ชัน npm view conard versions
เพื่อดูเวอร์ชันที่เผยแพร่ทั้งหมดของ package
บนเซิร์ฟเวอร์ npm
ดำเนินการ npm ls
เพื่อดูข้อมูลเวอร์ชันของแพ็กเกจทั้งหมดในแผนผังการพึ่งพาคลังสินค้าปัจจุบัน
เวอร์ชันของโมดูลใน npm包
ต้องเป็นไปตามข้อกำหนด SemVer
- กฎการแสดงหมายเลขเวอร์ชันแบบรวมที่เป็นแนวทางซึ่งร่างโดย Github
จริงๆ แล้วมันเป็นคำย่อของ Semantic Version
เว็บไซต์อย่างเป็นทางการของข้อกำหนด SemVer: https://semver.org/
มาตรฐาน หมายเลขเวอร์ชันมาตรฐานของข้อกำหนด SemVer
ใช้รูปแบบของ XYZ
โดยที่ X, Y และ Z เป็นจำนวนเต็มที่ไม่เป็นลบ และมีช่องว่างภายในเป็นศูนย์ที่ด้านหน้าตัวเลขคือ ต้องห้าม X คือหมายเลขเวอร์ชันหลัก Y คือหมายเลขเวอร์ชันรอง และ Z คือหมายเลขเวอร์ชันแก้ไข แต่ละองค์ประกอบจะต้องเพิ่มขึ้นเป็นตัวเลข
major
): เมื่อคุณทำการแก้ไข API ที่เข้ากันไม่ได้minor
): เมื่อคุณสร้างฟังก์ชันการทำงานที่เข้ากันได้แบบย้อนหลังpatch
): เมื่อคุณทำการแก้ไขปัญหาความเข้ากันได้แบบย้อนหลังตัวอย่างเช่น: 1.9.1 -> 1.10.0 -> 1.11.0
เมื่อเวอร์ชันมีการเปลี่ยนแปลงที่สำคัญ ไม่เสถียร และอาจไม่ตรงตามข้อกำหนดด้านความเข้ากันได้ที่คาดไว้ คุณอาจต้องการเผยแพร่เวอร์ชันล่วงหน้าก่อน
คุณสามารถเพิ่มหมายเลขเวอร์ชันนำหน้าได้ที่ส่วนท้ายของ "หมายเลขเวอร์ชันหลัก หมายเลขเวอร์ชันรอง หมายเลขการแก้ไข" ขั้นแรกให้เพิ่มหมายเลขการเชื่อมต่อ จากนั้นจึงเพิ่มชุดตัวระบุและข้อมูลการคอมไพล์เวอร์ชันโดยคั่นด้วยจุด
alpha
):beta
):rc
: Release candiate
มาดูเวอร์ชันย้อนหลังของ React
กัน:
จะเห็นได้ว่าเวอร์ชันดังกล่าวได้รับการเผยแพร่อย่างเคร่งครัดตามข้อกำหนด SemVer
:
主版本号.次版本号.修订号
อย่าง16.8.0 -> 16.8.1 -> 16.8.2
alpha
, beta
, rc
และเวอร์ชันขั้นสูงอื่นๆหลังจากแก้ไขฟังก์ชันบางอย่างของแพ็คเกจ npm
แล้ว ก็มักจะจำเป็นต้องปล่อย a เวอร์ชันใหม่ วิธีการปกติของเราคือการแก้ไข package.json
ให้เป็นเวอร์ชันที่ระบุโดยตรง หากการดำเนินการไม่ถูกต้อง อาจทำให้เกิดความสับสนได้ง่ายในหมายเลขเวอร์ชัน เราสามารถใช้คำสั่งที่สอดคล้องกับข้อกำหนด Semver
เพื่อดำเนินการนี้ให้เสร็จสิ้น:
npm version patch
: อัปเกรดหมายเลขการแก้ไขnpm version minor
: อัปเกรดหมายเลขเวอร์ชันรองnpm version major
: อัปเกรดเวอร์ชันหลักหมายเลขในการพัฒนาเป็นสิ่งที่ขาดไม่ได้อย่างแน่นอนสำหรับการทำงานของหมายเลขเวอร์ชันบางเวอร์ชัน หากหมายเลขเวอร์ชันเหล่านี้สอดคล้องกับข้อกำหนด SemVer
เราสามารถใช้แพ็คเกจ npm semver
สำหรับเวอร์ชันปฏิบัติการเพื่อช่วยเราได้ เปรียบเทียบขนาดเวอร์ชัน แยกข้อมูลเวอร์ชัน และการดำเนินการอื่นๆ
Npm ยังใช้เครื่องมือนี้เพื่อจัดการงานการกำหนดเวอร์ชันด้วย
การติดตั้ง npm semver
semver.gt ('1.2.3', '9.8.7') // false semver.lt('1.2.3', '9.8.7') // true
semver.valid('1.2.3') // '1.2.3' semver.valid('abc') // null
semver.valid(semver.coerce('v2')) // '2.0.0' semver.valid(semver.coerce('42.6.7.9.3-alpha')) //
semver.clean(' =v1.2.3 ') // '1.2.3' semver.satisfies('1.2.3', '1.x || >=2.5.0 || 5.0.0 - 7.2.3') // จริง semver.minVersion('>=1.0.0') // '1.0.0'
การใช้งานข้างต้นคือการใช้งาน semver ที่พบบ่อยที่สุด สำหรับรายละเอียดเพิ่มเติม โปรดดูเอกสารประกอบ semver: https://github.com/npm/node -semver
เรามักจะเห็นวิธีการต่างๆ ในการเขียนการขึ้นต่อกันต่างๆ ใน package.json
:
"dependencies": { "สัญญาณ": "1.4.0", "figlet": "*", "ตอบสนอง": "16.x", "ตาราง": "~5.4.6", "yargs": "^14.0.0" }
สามข้อแรกเข้าใจง่าย:
"signale": "1.4.0"
: หมายเลขเวอร์ชันคงที่"figlet": "*"
: Any version ( >=0.0.0
)"react": "16.x"
: Match main Version ( >=16.0.0 <17.0.0
)"react": "16.3.x"
: จับคู่เวอร์ชันหลักและเวอร์ชันรอง ( >=16.3.0 <16.4.0
)มาดูสองอันสุดท้ายกัน หมายเลขเวอร์ชัน สัญลักษณ์ ~
และ ^
อ้างอิงถึง:
~
: เมื่อได้รับเวอร์ชันใหม่เมื่อติดตั้งการขึ้นต่อกัน ให้ติดตั้งเวอร์ชันล่าสุดของ z
ใน xyz
นั่นคือ แม้ว่าหมายเลขเวอร์ชันหลักและหมายเลขเวอร์ชันรองจะไม่เปลี่ยนแปลง แต่หมายเลขเวอร์ชันล่าสุดจะยังคงอยู่^
: เมื่อได้รับเวอร์ชันใหม่เมื่อทำการติดตั้งการขึ้นต่อกัน ทั้ง y
และ z
ใน xyz
ที่ติดตั้งจะเป็นเวอร์ชันล่าสุด นั่นคือ แม้จะรักษาหมายเลขเวอร์ชันหลักไว้ไม่เปลี่ยนแปลง แต่ให้เก็บหมายเลขเวอร์ชันรองและหมายเลขการแก้ไขให้เป็นเวอร์ชันล่าสุดการขึ้นต่อกันที่พบบ่อยที่สุดในไฟล์ package.json
ควรเป็น "yargs": "^14.0.0"
เนื่องจากเมื่อเราใช้ npm install package
เพื่อติดตั้งแพ็คเกจ npm
จะติดตั้งเวอร์ชันล่าสุดตามค่าเริ่มต้น จากนั้นจึงติดตั้งในส่วนเพิ่ม เครื่องหมาย ^
หน้าหมายเลขเวอร์ชัน
โปรดทราบว่าเมื่อหมายเลขเวอร์ชันหลักคือ 0
จะถือว่าเป็นเวอร์ชันที่ไม่เสถียร สถานการณ์แตกต่างจากด้านบน:
0
: ^0.0.z
และ ~0.0.z
ทั้งคู่ ถือเป็นเวอร์ชันที่แก้ไขแล้ว จะไม่มีการเปลี่ยนแปลงเกิดขึ้นเมื่อติดตั้งการขึ้นต่อกัน0
: ^0.yz
ทำงานเหมือนกับ ~0.yz
เฉพาะหมายเลขการแก้ไขเท่านั้นที่จะเก็บไว้เป็นเวอร์ชันล่าสุด2.5หมายเลขเวอร์ชัน 1.0.0 ใช้เพื่อกำหนด API สาธารณะ เมื่อซอฟต์แวร์ของคุณออกสู่สภาพแวดล้อมอย่างเป็นทางการ หรือมี API ที่เสถียร คุณสามารถเผยแพร่เวอร์ชัน 1.0.0 ได้ ดังนั้น เมื่อคุณตัดสินใจที่จะเผยแพร่เวอร์ชันอย่างเป็นทางการของแพ็คเกจ npm สู่โลกภายนอก ให้ทำเครื่องหมายเวอร์ชันเป็น 1.0.0
ในการพัฒนาจริง ปัญหาแปลก ๆ มักเกิดขึ้นเนื่องจากความไม่สอดคล้องกันในการขึ้นต่อกันต่างๆ หรือในบางสถานการณ์ เราไม่ต้องการให้การอัปเดตการขึ้นต่อกัน ขอแนะนำให้ใช้ package-lock.json
ในระหว่างการพัฒนา
การล็อกเวอร์ชันอ้างอิงหมายความว่าเว้นแต่เราจะอัปเดตด้วยตนเอง เวอร์ชันที่แก้ไขจะถูกติดตั้งทุกครั้งที่เราติดตั้งการขึ้นต่อกัน ตรวจสอบให้แน่ใจว่าทั้งทีมใช้การอ้างอิงที่มีหมายเลขเวอร์ชันที่สอดคล้องกัน
แต่ละครั้งที่คุณติดตั้งเวอร์ชันคงที่ ไม่จำเป็นต้องคำนวณช่วงเวอร์ชันการขึ้นต่อกัน ซึ่งสามารถเร่งเวลาการติดตั้งการขึ้นต่อกันในสถานการณ์ส่วนใหญ่ได้อย่างมาก
เมื่อใช้ package-lock.json ตรวจสอบให้แน่ใจว่าเวอร์ชัน npm นั้นสูงกว่า 5.6 เนื่องจากระหว่าง 5.0 ถึง 5.6 ตรรกะการประมวลผลของ package-lock.json ได้รับการอัปเดตหลายครั้ง และตรรกะหลังการประมวลผลของเวอร์ชัน 5.6 จะค่อยๆ เสถียร
เราจะวิเคราะห์โครงสร้างโดยละเอียดของ package-lock.json
ในบทต่อๆ ไป
จุดประสงค์ของเราใน
ในสถานการณ์การพัฒนาจริง แม้ว่าเราจะไม่จำเป็นต้องติดตั้งเวอร์ชันใหม่ทุกครั้ง แต่เรายังคงจำเป็นต้องอัปเกรดเวอร์ชันการพึ่งพาอย่างสม่ำเสมอ เพื่อให้เราสามารถเพลิดเพลินกับการแก้ไขปัญหา การปรับปรุงประสิทธิภาพ และการอัปเดตคุณลักษณะใหม่ที่เกิดจากการอัพเกรดแพ็คเกจการพึ่งพา
การใช้ npm outdated
สามารถช่วยเราแสดงรายการการขึ้นต่อกันที่ไม่ได้รับการอัปเกรดเป็นเวอร์ชันล่าสุด:
และดำเนินการ npm update
อัปเกรดการอ้างอิงสีแดงทั้งหมด
1.0.0
主版本号.次版本号.修订号
alpha、beta、rc
เวอร์ชันขั้นสูงอื่น ๆ ก่อนnpm
ทั้งหมดที่พัฒนาโดยสมาชิกในทีม ในขณะนี้ ขอแนะนำให้เปลี่ยนคำนำหน้าเวอร์ชัน ~
การขึ้นต่อกันของโปรเจ็กต์หลักจะต้องอัปเกรดทุกครั้งที่อัปเดตการขึ้นต่อกันย่อยซึ่งยุ่งยากมาก หากการขึ้นต่อกันย่อยนั้นเชื่อถือได้อย่างสมบูรณ์ ให้เปิดโดยตรง ^
อัปเกรดเป็นเวอร์ชันล่าสุดทุกครั้งdocker
และการขึ้นต่อกันย่อยยังคงได้รับการพัฒนาและอัปเกรดในเครื่อง ก่อนที่จะเผยแพร่เวอร์ชัน docker
เวอร์ชันการขึ้นต่อกันทั้งหมดจะต้องถูกล็อคเพื่อให้แน่ใจว่าจะไม่มีปัญหาออนไลน์หลังจากที่การขึ้นต่อกันในเครื่องนั้น ปล่อยแล้ว.npm
สูงกว่า 5.6
และตรวจสอบให้แน่ใจว่าไฟล์ package-lock.json
ถูกเปิดใช้งานตามค่าเริ่มต้นnpm inatall
แล้ว package-lock.json
จะถูกส่งไปยังคลังสินค้าระยะไกล อย่าส่ง node_modules
ไปยังที่เก็บระยะไกลโดยตรงnpm update
เป็นประจำเพื่ออัพเกรดการขึ้นต่อกัน และส่งไฟล์ lock
เพื่อให้แน่ใจว่าสมาชิกคนอื่น ๆ จะอัพเดตการขึ้นต่อกันพร้อมกัน อย่าเปลี่ยนไฟล์ lock
ด้วยตนเองlock
package.json
และดำเนินการ npm install
package.json
npm install package@version
npm install
อาจจะต้องผ่านกระบวนการข้างต้น บทนี้จะพูดถึงรายละเอียดการใช้งาน การพัฒนา และเหตุผลของแต่ละกระบวนการ
เราทุกคนรู้ดีว่าหลังจากดำเนินการ npm install
แล้ว แพ็คเกจที่ต้องพึ่งพาจะถูกติดตั้งลงใน node_modules
มาดูกลไกเฉพาะที่ npm
ติดตั้งแพ็คเกจที่ต้องพึ่งพาใน node_modules
ให้ละเอียดยิ่งขึ้น
ในเวอร์ชันก่อนหน้าของ npm
วิธีจัดการการขึ้นต่อกัน npm
นั้นง่ายและไม่ซับซ้อน โดยจะติดตั้งการขึ้นต่อกันใน node_modules
ตามลำดับและเป็นไปตามโครงสร้าง package.json
และโครงสร้าง package.json
ของแพ็คเกจการพึ่งพาย่อยอย่างเคร่งครัด จนกว่าจะมีแพ็คเกจย่อยที่ไม่ขึ้นอยู่กับโมดูลอื่นอีกต่อไป
ตัวอย่างเช่น โมดูล my-app
ของเราตอนนี้ขึ้นอยู่กับสองโมดูล: buffer
และ ignore
:
{ "ชื่อ": "แอปของฉัน", "การอ้างอิง": { "บัฟเฟอร์": "^5.4.3", "ละเว้น": "^5.1.4", - }
ignore
เป็นโมดูล JS
ล้วนๆ ที่ไม่ขึ้นอยู่กับโมดูลอื่นๆ และ buffer
ขึ้นอยู่กับสองโมดูลต่อไปนี้: base64-js
และ ieee754
- "ชื่อ": "บัฟเฟอร์", "การอ้างอิง": { "base64-js": "^1.0.2", "ieee754": "^1.1.4" - }
จากนั้น หลังจากดำเนินการ npm install
โครงสร้างไดเร็กทอรีโมดูลใน node_modules
ที่ได้รับจะเป็นดังนี้:
ข้อดีของวิธีนี้ชัดเจน โครงสร้างของ node_modules
สอดคล้องกับโครงสร้างของ package.json
แบบหนึ่งต่อหนึ่ง โครงสร้างลำดับชั้นนั้นชัดเจน และโครงสร้างไดเร็กทอรีของการติดตั้งแต่ละครั้งรับประกันว่าจะเหมือนกัน
อย่างไรก็ตาม ลองจินตนาการว่า ถ้าคุณพึ่งพาโมดูลจำนวนมาก node_modules
ของคุณจะใหญ่มากและระดับการซ้อนจะลึกมาก:
Windows
ความยาวพาธของไฟล์สูงสุดคือ 260 อักขระ และระดับการซ้อนที่ลึกเกินไปอาจทำให้เกิดปัญหาที่คาดเดาไม่ได้เพื่อที่จะแก้ไขปัญหาข้างต้น NPM
ได้ทำการอัปเดตครั้งใหญ่ในเวอร์ชัน 3.x
โดยจะเปลี่ยนโครงสร้างที่ซ้อนกันตั้งแต่ต้นไปเป็นโครงสร้างแบบเรียบ:
node_modules
ด้วยโครงสร้างการพึ่งพาข้างต้น เราจะได้โครงสร้างไดเร็กทอรีต่อไปนี้หลังจากดำเนินการ npm install
:
ในเวลานี้ถ้าเราพึ่งพารุ่น [email protected]
ในโมดูล:
{ "ชื่อ": "my-app", "การอ้างอิง": { "บัฟเฟอร์": "^5.4.3" "ละเว้น": "^5.1.4" "base64-js": "1.0.1" - }
node_modules
ณ จุดนี้เราจะได้รับโครงสร้างไดเรกทอรีต่อไปนี้หลังจากดำเนินการ npm install
:
ถ้าเราอ้างอิงโมดูลในรหัสโครงการกระบวนการค้นหาโมดูลมีดังนี้:
node_modules
node_modules
node_modules
ทั่วโลก[email protected]
buffer2@^5.4.3
ดังนั้นรุ่น npm 3.x
ไม่ได้แก้ปัญหาความซ้ำซ้อนของโมดูลอย่างสมบูรณ์ของเวอร์ชันเก่าและอาจนำปัญหาใหม่มาใช้
ลองนึกภาพว่าแอพของคุณไม่ได้ขึ้นอยู่กับรุ่น [email protected]
แต่คุณยังขึ้นอยู่กับ buffer
และ buffer2
ที่ขึ้นอยู่กับรุ่น base64-js
ที่แตกต่างกัน เนื่องจากเมื่อดำเนินการ npm install
การพึ่งพาใน package.json
จะถูกแยกวิเคราะห์ตามลำดับลำดับที่ buffer
และ buffer2
จะถูกวางไว้ใน package.json
กำหนดโครงสร้างการพึ่งพาของ node_modules
:
ขึ้นอยู่กับ buffer2
ก่อน:
ขึ้นอยู่กับ buffer
ก่อน:
นอกจากนี้เพื่อให้นักพัฒนาสามารถใช้แพ็คเกจการพึ่งพาล่าสุดภายใต้หลักฐานความปลอดภัยเรามักจะล็อคเฉพาะเวอร์ชันขนาดใหญ่ใน package.json
ซึ่งหมายความว่าหลังจากรุ่นรองของแพ็คเกจการพึ่งพาบางส่วนได้รับการปรับปรุงโครงสร้างการพึ่งพา นอกจากนี้ยังมีการเปลี่ยนแปลง
เพื่อแก้ปัญหาความไม่แน่นอนของ npm install
ไฟล์ package-lock.json
ถูกเพิ่มในเวอร์ชัน npm 5.x
และวิธีการติดตั้งยังเป็นไปตามวิธีการแบนของ npm 3.x
ฟังก์ชั่นของ package-lock.json
package-lock.json
npm install
ล็อคโครงสร้างการ node_modules
.
ตัวอย่างเช่นเรามีโครงสร้างการพึ่งพาต่อไปนี้:
{ "ชื่อ": "my-app", "การอ้างอิง": { "บัฟเฟอร์": "^5.4.3" "ละเว้น": "^5.1.4" "base64-js": "1.0.1" - }
package-lock.json
ที่สร้างขึ้นหลังจากดำเนินการ npm install
เป็นดังนี้:
{ "ชื่อ": "my-app", "เวอร์ชัน": "1.0.0", "การอ้างอิง": { "base64-js": { "เวอร์ชัน": "1.0.1" "แก้ไข": "https://registry.npmjs.org/base64-js/-/base64-js-1.0.1.tgz" "ความสมบูรณ์": "sha1-asbrszt7xze47tutdw3i/np+pag =" - "บัฟเฟอร์": { "เวอร์ชัน": "5.4.3" "แก้ไข": "https://registry.npmjs.org/buffer/-/buffer-5.4.3.tgz" "ความซื่อสัตย์": "sha512-zvj65tkfeit3i6aj5bivjdzjjqqgs4o/snoezg1f1kyap9nu2jcudpwzrsjthmmzg0h7bzkn4rnqpimhuxwx2a ==" "กำหนดให้มี": { "base64-js": "^1.0.2" "IEEE754": "^1.1.4" - "การอ้างอิง": { "base64-js": { "เวอร์ชัน": "1.3.1" "แก้ไข": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz" "ความสมบูรณ์": "sha512-mlq4i2qo1ytvgwfwmcngko // jxaquezvwektjgqfm4jik0ku+ytmfpll8j+n5mspofjhwoag+9yhb7bwahm36g ==" - - - "IEEEE754": { "เวอร์ชัน": "1.1.13" "แก้ไข": "https://registry.npmjs.org/ieeee754/-/ieee754-1.1.13.tgz" "ความสมบูรณ์": "sha512-4vf7i2lyv/hawerso3xmlmkp5ez83i+/cdluxi/igts/o1sejbnhttnxzmrzfvouqj7lzjqhketvpgsfdlwztg ==" - "ไม่สนใจ": { "เวอร์ชัน": "5.1.4" "แก้ไข": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz" "ความซื่อสัตย์": "sha512-mzbusahktw1u7jpkkjy7lcard1fu5w2rldxlm4kdkayucwzimjkpluf9cm1alewyjgupdqewlam18y6au69a8a ==" - - }
มาดูโครงสร้างด้านบนอย่างใกล้ชิด:
name
และ version
นอกสุดสองชื่อและเวอร์ชันนั้นเหมือนกับ name
และ version
ใน package.json
และใช้เพื่ออธิบายชื่อแพ็คเกจและเวอร์ชันปัจจุบัน
dependencies
เป็น key
ซึ่งสอดคล้องกับ node_modules
resolved
version
node_modules
dependencies
requires
integrity
hash
Subresource Integrity
ตรวจสอบว่าแพคเกจซอฟต์แวร์ที่ติดตั้งได้รับการแก้ไขหรือไม่ถูกต้องหรือไม่package.json
การพึ่งพา Jsondependencies
: โครงสร้างนั้นเหมือนกับโครงสร้าง dependencies
ด้านนอกและเก็บแพ็คเกจการพึ่งพาที่ติดตั้งไว้ใน node_modules
ที่พึ่งพาอาศัยกันหมายเหตุ node_modules
นี่ว่าแอตทริบิวต์ย่อยทั้งหมดไม่ได้มีแอตทริบิวต์ dependencies
ตัวอย่างเช่นตรวจสอบการพึ่งพาด้านบน:
รุ่น [email protected]
เราพึ่งพาความขัดแย้ง my-app
กับ base64-js@^1.0.2
เราพึ่งพาใน buffer
ดังนั้น [email protected]
จะต้องติดตั้งใน node_modules
ของ แพ็คเกจ buffer
ซึ่งสอดคล้องกับแอตทริบิวต์ dependencies
ของ buffer
ใน package-lock.json
มีการเปลี่ยนแปลง นอกจากนี้ยังสอดคล้องกับวิธีการแบนของ npm
ในการพึ่งพา
ดังนั้นตามการวิเคราะห์ข้างต้นไฟล์ package-lock.json
package-lock.json
โครงสร้างไดเรกทอรี node_modules
อยู่ในการติดต่อแบบหนึ่งต่อหนึ่ง สร้างโดยการติดตั้งแต่ละครั้ง
นอกจากนี้การใช้ package-lock.json
ในโครงการสามารถเพิ่มความเร็วในการติดตั้งอย่างมีนัยสำคัญ
เราใช้คำสั่ง npm i --timing=true --loglevel=verbose
lock
lock
กระบวนการที่สมบูรณ์ของ npm install
ทำความสะอาดแคช npm
ก่อนเปรียบเทียบ
โดยไม่ต้องใช้ไฟล์ lock
:
ใช้ไฟล์ lock
:
จะเห็นได้ว่าเวอร์ชันเฉพาะและลิงก์ดาวน์โหลดของแต่ละแพ็คเกจได้รับการแคชใน package-lock.json
คำขอเครือข่ายจำนวนมาก
ในการพัฒนาแอปพลิเคชันระบบขอแนะนำให้ส่งไฟล์ package-lock.json
ไปยังที่เก็บเวอร์ชันรหัสเพื่อให้แน่ใจว่าเวอร์ชันการพึ่งพาที่ติดตั้งโดยนักพัฒนาทีมทั้งหมดและลิงก์ CI
นั้นสอดคล้องกันเมื่อดำเนินการ npm install
เมื่อ semver
แพ็คเกจ npm
แพ็คเกจ npm
ของคุณจะต้องขึ้นอยู่กับที่เก็บข้อมูลอื่น ๆ ภายในขอบเขตซึ่งจะทำให้เกิดความซ้ำซ้อนที่ไม่จำเป็น ดังนั้นเราไม่ควรเผยแพร่ไฟล์ package-lock.json
( npm
จะไม่เผยแพร่ไฟล์ package-lock.json
ตามค่าเริ่มต้น)
หลังจากดำเนินการคำสั่ง npm install
หรือ npm update
เพื่อดาวน์โหลดการอ้างอิงนอกเหนือจากการติดตั้งแพ็คเกจการพึ่งพาในไดเรกทอรี node_modules
แล้วสำเนาจะถูกแคชในไดเรกทอรีแคชท้องถิ่น
คุณสามารถสืบค้นได้ผ่านคำสั่ง npm config get cache
: ใน Linux
หรือ Mac
ค่าเริ่มต้นคือไดเรกทอรี .npm/_cacache
ในไดเรกทอรีบ้านของผู้ใช้
tar
tar
ไดเรกทอรีในไดเรกทอรีนี้ hash
content-v2
content-v2
และ index-v5
index-v5
เมื่อ NPM กำลังดำเนินการติดตั้งมันสามารถสร้าง key
ที่ไม่ซ้ำกันที่สอดคล้องกับบันทึกแคชในไดเรกทอรี index-v5
ตาม integrity、version、name
ที่เก็บไว้ใน package-lock.json
จึงค้นหา hash
ของแพ็คเกจ tar
จากนั้นมองหามันตาม hash
tar
เราสามารถค้นหาแพ็คเกจเพื่อค้นหาและทดสอบในไดเรกทอรีแคชและค้นหาพา ธ แพ็คเกจใน index-v5
:
grep "https://registry.npmjs.org/base64-js/-/base64-js-1.0.1 tgz "-r index -v5
จากนั้นเราจัดรูปแบบ JSON:
{ "คีย์": "pacote: เวอร์ชัน-manifest: https: //registry.npmjs.org/base64-js/-/base64-js-1.0.1.tgz: sha1-asbrszt7xze47tutdw3i/np+pag =" "ความสมบูรณ์": "sha512-c2ekhxwxvlsbrucjtrs3xfhv7mf/y9klmkdxpte8yevcoh5h8ae69y+/lp+ahpw91crnzgo78elok2e6apjfiq ==" "เวลา": 1575554308857 "ขนาด": 1, "ข้อมูลเมตา": { "id": "[email protected]" "Manifest": { "ชื่อ": "base64-js", "เวอร์ชัน": "1.0.1" "เครื่องยนต์": { "โหนด": "> = 0.4" - "การพึ่งพา": {}, "Optionaldependencies": {}, "DevDependencies": { "มาตรฐาน": "^5.2.2" "เทป": "4.x" - "Bundledependencies": เท็จ "peerdependencies": {}, "เลิกใช้แล้ว": เท็จ "_resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.0.1.tgz" "_integrity": "sha1-asbrszt7xze47tutdw3i/np+pag =" "_shasum": "6926D1B194FBC737B8EED513756DE2FCDA7EA408" "_shrinkwrap": null, "bin": null, "_id": "[email protected]" - "type": "สรุป-manifest" - }
แอตทริบิวต์ _shasum
ข้างต้น 6926d1b194fbc737b8eed513756de2fcda7ea408
เป็น hash
ของแพ็คเกจ tar
และ 6926
สองสามตัวแรกของ hash
กลยุทธ์การแคชข้างต้นเริ่มต้นจากเวอร์ชัน NPM V5 }.
npm
มีคำสั่งหลายคำในการจัดการข้อมูลแคช:
npm cache add
: คำอธิบายอย่างเป็นทางการคือคำสั่งนี้ส่วนใหญ่ใช้ภายในโดย npm
แต่ยังสามารถใช้เพื่อเพิ่มแคชด้วยตนเองในแพ็คเกจที่ระบุnpm cache clean
--force
ลบข้อมูลทั้งหมดในไดเรกทอรีแคชnpm cache verify
: ตรวจสอบความถูกต้องและความสมบูรณ์ของข้อมูลแคชและทำความสะอาดข้อมูลขยะจากข้อมูลที่แคช NPM ให้โหมดการติดตั้งออฟไลน์ซึ่งมีดังนี้:
--prefer-offline
: ใช้ข้อมูลแคชก่อน--prefer-online
: จัดลำดับความสำคัญการใช้ข้อมูลเครือข่าย--offline
: อย่าขอเครือข่ายและใช้ข้อมูลแคชโดยตรงที่เราพูดถึงความสมบูรณ์ของไฟล์หลายครั้งข้างต้นดังนั้นการตรวจสอบความสมบูรณ์ของไฟล์คืออะไร?
ก่อนที่จะดาวน์โหลดแพ็คเกจการพึ่งพาเรามักจะได้ shasum
ค่า hash
hash
tarball
โดย npm
npm info
แพ็คเกจการพึ่งพา
hash
ผู้ใช้ดาวน์โหลดแพ็คเกจการพึ่งพาอาศัยกันในเครื่องเขาหรือเธอต้องตรวจสอบให้แน่ใจว่าไม่มีข้อผิด hash
เกิดขึ้นในระหว่างกระบวนการดาวน์โหลด เหมือนกันตรวจสอบให้แน่ใจว่าการพึ่งพาที่ดาวน์โหลดเสร็จสมบูรณ์
ตอนนี้กระบวนการโดยรวมเสร็จสมบูรณ์ให้สรุปกระบวนการข้างต้น:
ตรวจสอบไฟล์ .npmrc
: ลำดับความสำคัญคือ: ไฟล์ระดับโครงการ .npmrc
> ไฟล์ระดับผู้ใช้ .npmrc
.npmrc
ไฟล์ระดับโลก .npmrc
ไฟล์
ตรวจสอบว่ามีไฟล์ lock
ในโครงการหรือไม่
ไม่มีไฟล์ lock
:
npm
package.json
node_modules
node_modules
ของโมดูลปัจจุบันnpm
แพ็คเกจดาวน์โหลดคลังสินค้าระยะไกลnode_modules
npm
lock
package-lock.json
package.json
lock
node_modules
node_modules
การพึ่งพาpackage-lock.json
.กระบวนการข้างต้นอธิบายกระบวนการทั่วไปของ npm install
npm install package --timing=true --loglevel=verbose
ย่อ กระบวนการติดตั้งและรายละเอียดของแพ็คเกจที่แน่นอน
yarn
package-lock.json
รับการปล่อยตัวใน 2016
ในเวลานั้น npm
ยังคงอยู่ในช่วง V3
ของนักพัฒนา ณ จุดนี้ yarn
เกิด:
ข้างต้นเป็นข้อดีของ yarn
ที่กล่าวถึงในเว็บไซต์ทางการซึ่งยังคงน่าสนใจมากในเวลานั้น แน่นอนว่า npm
ในภายหลังได้ตระหนักถึงปัญหาของตัว yarn
และ yarn
lock
ให้เหมาะสมมาก การออกแบบยังคงดีมาก
yarn
ยังใช้โครงสร้างแบนของ yarn.lock
npm v3
เพื่อจัดการ yarn.lock
พึ่งพา เป็นไฟล์ autogenerated # เส้นด้ายล็อคไฟล์ v1 [email protected]: เวอร์ชัน "1.0.1" แก้ไข "https://registry.yarnpkg.com/base64-js/-/base64-js-1.0.1.tgz#6926d1b194fbc737b8eed513756de2fcda7ea408" ความสมบูรณ์ sha1-asbrszt7xze47tutdw3i/np+pag = base64-js@^1.0.2: เวอร์ชัน "1.3.1" แก้ไข "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" Integrity sha512-mlq4i2qo1ytvgwfwmcngko // jxaquezvwektjgqfm4jik0ku+ytmfpll8j+n5mspofjhwoag+9yhb7bwahm36g == buffer@^5.4.3: เวอร์ชัน "5.4.3" ได้รับการแก้ไข "https://registry.yarnpkg.com/buffer/-/buffer-5.4.3.tgz#3fbc9c69eb713d323e3fc1a895eee0710c072115" Integrity SHA512-ZVJ65TKFEIT3I6AJ5BIVJDZJJQQGS4O/SNOEZG1F1KYAP9NU2JCUDPWZRSJTHMMZG0H7BZKN4RNQPIMHUXWX2A === การพึ่งพา: base64-js "^1.0.2" IEEE754 "^1.1.4" IEEE754@^1.1.4: เวอร์ชัน "1.1.13" ได้รับการแก้ไข "https://registry.yarnpkg.com/ieeee754/-/ieee754-1.1.13.TGZ#ec168558E95AA181FD87D37F55C32BBCB6708B84" ความสมบูรณ์ sha512-4vf7i2lyv/hawerso3xmlmkp5ez83i+/cdluxi/igts/o1sejbnhttnxzmrzfvouqj7lzjqhketvpgsfdlwztg == changore@^5.1.4: เวอร์ชัน "5.1.4" แก้ไข "https://registry.yarnpkg.com/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97Adf"ความ
package-lock.json
sha512-mzbusahktw1u7jpkkjy7lcard1fu5w2rldxlm4kdkayucwzimjkpluf9cm1alewyjgupdqewlam18y6au69a8a ==
yarn.lock
json
package-lock.json
yarn.lock
หมายเลขเวอร์ชันของการพึ่งพานิวตรอน yarn.lock
ไม่ได้รับการแก้ไขซึ่งหมายความว่า yarn.lock
เพียงอย่างเดียวไม่สามารถกำหนดโครงสร้างไดเรกทอรี node_modules
และจำเป็นต้องประสานงานกับไฟล์ package.json
และ package-lock.json
ต้องการเพียงไฟล์เดียวเพื่อกำหนดกลยุทธ์การแคชของ yarn
ดูคล้ายกันมากก่อนที่ npm v5
ใช้ COMMANT yarn cache dir
เพื่อดูไดเรกทอรีของข้อมูลแคช:
โดยค่าเริ่มต้น
yarn
ใช้โหมดprefer-online
ซึ่งหมายถึงข้อมูลเครือข่ายจะถูกใช้ก่อน
ฉันหวังว่าหลังจากอ่านบทความนี้มันจะช่วยคุณได้ดังนี้:
npm
pacakge.json
เพื่อให้ข้อมูลเชิงลึกเพิ่มเติมเกี่ยวกับการกำหนดค่าทางวิศวกรรมโครงการnpm install
npm
package-lock.json