Câu trả lời:
Từ các tài liệu npm :
Nói tóm lại, sự khác biệt chính giữa việc sử dụng cài đặt npm và npm ci là:
- Dự án phải có gói-lock.json hoặc npm-shrwrap.json hiện có.
- Nếu các phụ thuộc trong khóa gói không khớp với các gói trong gói.json, npm ci sẽ thoát với một lỗi, thay vì cập nhật khóa gói.
- npm ci chỉ có thể cài đặt toàn bộ dự án tại một thời điểm: các phụ thuộc riêng lẻ có thể được thêm bằng lệnh này.
- Nếu một nút_modules đã có sẵn, nó sẽ tự động bị xóa trước khi npm ci bắt đầu cài đặt.
- Nó sẽ không bao giờ ghi vào pack.json hoặc bất kỳ khóa-gói nào: các bản cài đặt về cơ bản bị đóng băng.
Về cơ bản,
npm installđọc package.jsonđể tạo danh sách các phụ thuộc và sử dụng package-lock.jsonđể thông báo phiên bản nào của các phụ thuộc này sẽ được cài đặt. Nếu một phụ thuộc không có trong package-lock.jsonnó sẽ được thêm vàonpm install .
npm ci(được đặt tên theo C liên tục I ntegration) cài đặt các phụ thuộc trực tiếp từ package-lock.jsonvà package.jsonchỉ sử dụng để xác thực rằng không có phiên bản không khớp. Nếu bất kỳ phụ thuộc nào bị thiếu hoặc có phiên bản không tương thích, nó sẽ gây ra lỗi .
Sử dụng npm installđể thêm các phụ thuộc mới và để cập nhật các phụ thuộc vào một dự án. Thông thường, bạn sẽ sử dụng nó trong quá trình phát triển sau khi lấy các thay đổi cập nhật danh sách các phụ thuộc nhưng có thể nên sử dụng npm citrong trường hợp này.
Sử dụng npm cinếu bạn cần một bản dựng xác định, lặp lại. Ví dụ, trong quá trình tích hợp liên tục, các công việc tự động, v.v. và khi cài đặt phụ thuộc lần đầu tiên, thay vì npm install.
npm installnpm-shrinkwrap.jsonvà package-lock.json(theo thứ tự đó).node_modules.package.jsonhoặc package-lock.json.
npm i packagename) nó có thể ghi vào package.jsonđể thêm hoặc cập nhật phụ thuộc.npm i) nó có thể ghi vào package-lock.jsonđể khóa phiên bản của một số phụ thuộc nếu chúng chưa có trong tệp này.npm cipackage-lock.jsonhoặc npm-shrinkwrap.jsonphải có mặt.package.json.node_modulesvà cài đặt tất cả các phụ thuộc cùng một lúc.package.jsonhay package-lock.json.Trong khi npm citạo toàn bộ cây phụ thuộc từ package-lock.jsonhoặc npm-shrinkwrap.json, npm install cập nhật nội dungnode_modules sử dụng thuật toán ( nguồn ) sau:
load the existing node_modules tree from disk clone the tree fetch the package.json and assorted metadata and add it to the clone walk the clone and add any missing dependencies dependencies will be added as close to the top as is possible without breaking any other modules compare the original tree with the cloned tree and make a list of actions to take to convert one to the other execute all of the actions, deepest first kinds of actions are install, update, remove and move
npm install packagecó thể sửa đổi cả hai package-lock.json và package.json , trong khi các npm installđối số không chỉ sửa đổipackage-lock.json
npm cisẽ xóa mọi thư mục node_modules hiện có và dựa vào package-lock.jsontệp để cài đặt phiên bản cụ thể của từng gói. Nó nhanh hơn đáng kể so với cài đặt npm vì nó bỏ qua một số tính năng. Cài đặt trạng thái sạch sẽ rất tốt cho các đường ống ci / cd và các bản dựng docker! Bạn cũng sử dụng nó để cài đặt tất cả mọi thứ cùng một lúc và không phải các gói cụ thể.
Các tài liệu bạn liên kết đã có bản tóm tắt:
Nói tóm lại, sự khác biệt chính giữa việc sử dụng cài đặt npm và npm ci là:
- Dự án phải có gói-lock.json hoặc npm-shrwrap.json hiện có.
- Nếu các phụ thuộc trong khóa gói không khớp với các gói trong gói.json, npm ci sẽ thoát với một lỗi, thay vì cập nhật khóa gói.
- npm ci chỉ có thể cài đặt toàn bộ dự án tại một thời điểm: các phụ thuộc riêng lẻ có thể được thêm bằng lệnh này.
- Nếu một nút_modules đã có sẵn, nó sẽ tự động bị xóa trước khi npm ci bắt đầu cài đặt.
- Nó sẽ không bao giờ ghi vào pack.json hoặc bất kỳ khóa-gói nào: các bản cài đặt về cơ bản bị đóng băng.
Các lệnh rất giống nhau về chức năng tuy nhiên sự khác biệt nằm ở cách tiếp cận được thực hiện để cài đặt các phụ thuộc được chỉ định trong tệp package.jsonvà package-lock.jsontệp của bạn .
npm cithực hiện cài đặt sạch tất cả các phụ thuộc của ứng dụng của bạn trong khi npm installcó thể bỏ qua một số cài đặt nếu chúng đã tồn tại trên hệ thống. Một vấn đề có thể phát sinh nếu phiên bản đã được cài đặt trên hệ thống không phải là phiên bản bạn package.jsonđịnh cài đặt, tức là phiên bản đã cài đặt khác với phiên bản ' bắt buộc '.
Sự khác biệt khác là npm cikhông bao giờ chạm vào các package*.jsontập tin của bạn . Nó sẽ dừng cài đặt và hiển thị lỗi nếu các phiên bản phụ thuộc không khớp trong tệp package.jsonvà package-lock.json.
Bạn có thể đọc một lời giải thích tốt hơn nhiều từ các tài liệu chính thức ở đây .
Ngoài ra, bạn có thể muốn đọc về khóa gói ở đây .
Điều đáng lưu ý là các hình ảnh docker nút ánh sáng như alpine không được cài đặt Python, đây là một phụ thuộc node-gypđược sử dụng bởi npm ci.
Tôi nghĩ rằng có một chút ý kiến rằng để hoạt npm ciđộng, bạn cần cài đặt Python làm phụ thuộc trong bản dựng của mình.
Thêm thông tin ở đây Docker và npm - gyp ERR! không ổn
Bạn nên sử dụng chúng trong các tình huống khác nhau.
npm installlà tuyệt vời để phát triển và trong CI khi bạn muốn lưu trữ node_modulesthư mục. Khi nào sử dụng cái này? Bạn có thể làm điều này nếu bạn đang tạo một gói cho người khác sử dụng (bạn KHÔNG bao gồm node_modulestrong bản phát hành như vậy) . Về bộ nhớ đệm, hãy cẩn thận, nếu bạn có kế hoạch hỗ trợ các phiên bản Node.jsghi nhớ khác nhau node_modulescó thể phải được cài đặt lại do sự khác biệt giữa các Node.jsyêu cầu thời gian chạy. Nếu bạn muốn dính vào một phiên bản, hãy bám vào bản mới nhất LTS.
npm cinên được sử dụng khi bạn kiểm tra và phát hành ứng dụng sản xuất (sản phẩm cuối cùng, không được sử dụng bởi các gói khác) vì điều quan trọng là bạn phải cài đặt càng xác định càng tốt, việc cài đặt này sẽ mất nhiều thời gian hơn nhưng cuối cùng sẽ thực hiện ứng dụng của bạn đáng tin cậy hơn (bạn bao gồm node_modulestrong một bản phát hành như vậy) . Gắn bó với LTSphiên bản của Node.js.
Phần thưởng: Bạn có thể trộn chúng tùy thuộc vào mức độ phức tạp mà bạn muốn thực hiện. Trên các nhánh tính năng, gitbạn có thể lưu trữ bộ đệm node_modulesđể tăng năng suất cho nhóm của bạn và trên yêu cầu hợp nhất và các nhánh chính dựa trên npm cikết quả xác định.
npm installcó thể viết thư cho pack.json. Bạn có biết những gì nó có thể viết ở đây?