Cơ bản về Node, Yarn và file package.json

Posted on March 18th, 2019

Có khá nhiều định nghĩa và giải thích chi tiết ngoài kia về NodeJS, nên trong phạm vi bài viết này chủ yếu sẽ giới thiệu khái quát công nghệ này và một số lưu ý trong quá trình làm việc sử dụng npm, yarn, package.json

NodeJS

Có thể hiểu đơn giản NodeJS là một môi trường thực thi code Javascript bên ngoài browser.

Bạn sẽ sớm nhận ra rằng những framework, library của Javascript thông thường sẽ kết thúc bằng JS, cho nên trong phần còn lại, NodeJS sẽ được thay bằng Node cho tiện.

Trở lại những năm trước, khi mà Node chưa ra đời, người ta chủ yếu dùng Javascript cho việc validate form hay tạo hiệu ứng phía client side trong quá trình làm web, và lúc đó code Javascript được thực thi hoàn toàn trên môi trường browser mà developer đã attach file thông qua thẻ script của HTML. Năm 2009, đánh dấu một cột mốc quan trọng trong cộng đồng Javascript với sự ra đời của Node và nhiều năm sau đó là rất rất nhiều những thư viện, framework lần lượt ra đời. Có cái vẫn sống sót và phát triển tốt, có cái thì ngắc ngoải sớm nở tối tàn. Nhưng điều quan trọng còn sót lại sau mớ bòng bong công cụ, đó là lập trình viên giờ đây có thể làm rất nhiều thứ từ front-end đến back-end, thậm chí là lập trình di động chỉ với một ngôn ngữ lập trình xuyên suốt là Javascript. Một vài cái tên nổi bật có thể kể đến như MEAN stack (bao gồm MongoDB + Express + Angular của google + Node), React, Vue trong lập trình web. Trong khi React Native lại là câu chuyện khác về lập trình mobile đa nền tảng trên Android, iOS.

  • Để bắt đầu làm việc với Node, bạn sẽ cần download file cài đặt tại trang chủ, hệ thống sẽ tự động gợi ý file phù hợp với OS mà bạn đang dùng, ở đây bản LTS (Long Term Support) sẽ được khuyến khích sử dụng.

Node installation on MacOS

  • Tiến hành cài đặt như những phần mềm thông thường trên OS quen thuộc của bạn, bước cuối cùng Summary như trong hình, installer sẽ thông báo đã cài xong Node đi kèm là npm (sẽ giới thiệu bên dưới) với thông tin version cụ thể.
  • Kiểm tra cài đặt thành công bằng command trong Terminal:
$ node --version && npm --version
v10.15.3
6.4.1

NPM và Yarn

Những ngôn ngữ hiện đại thường cung cấp công cụ chính chủ hỗ trợ việc phân phối code để có thể chia sẻ, tái sử dụng dễ dàng, thường gọi là package manager. Ví dụ như RubyGems cho ngôn ngữ Ruby, Composer cho PHP; trong trường hợp này với Node của chúng ta là npmyarn

npm, viết tắt của Node Package Manager, là trình quản lý gói chính chủ đi kèm khi cài đặt Node. Dùng cho việc quản lý package và dependency trong các Node project.

Những package nói một cách đơn giản là đoạn code được ai đó đã viết từ trước, mà chúng ta muốn tái sử dụng nó trong project của mình thay vì phải ngồi viết lại. Một cách tương tự, có nhiều khả năng package mà chúng ta muốn sử dụng lại đang dùng những những package có sẵn khác để chính nó có thể hoạt động được, chúng gọi là những phụ thuộc (dependency). Thử nghĩ một ngày làm việc sẽ trở nên dài lê thê thế nào nếu phải tự tìm, cài đặt package và những dependency của chúng. Nhưng may mắn viễn cảnh đó không xảy đến nhờ vào package manager. Khi chúng ta install một package, nó sẽ tự động đi tìm và cài đặt những dependency tương ứng của package đó, lúc remove cũng tương tự, cho phép chúng ta quên đi những phụ thuộc và tập trung vào việc sử dụng package đó trong project.

yarn cũng là một package manager dành cho Node, mặc dù chỉ mới ra đời trong thời gian gần đây, nhưng nó nhanh chóng được chấp nhận rộng rãi và đang dần thay thế cho npm nhờ vào một số ưu điểm về tốc độ thực thi, hỗ trợ offline...

Cài đặt yarn trên macOS với Homebrew bằng command: brew install yarn. Hoặc vào trang chủ yarn để xem hướng dẫn theo OS của bạn.

Do đang sử dụng yarn khi làm việc, nên với cùng một tác vụ mình sẽ đề cập yarn trước và sau đó là command tương ứng của npm. Trên thực tế thì nó cũng không khác nhau nhiều. Nhìn chung những thao tác thông thường sẽ gồm: khởi tạo thông tin project, add / remove một package, nâng cấp version của package, add tất cả package.

  • Ban đầu khi bắt tay vào Node project, bạn sẽ khởi tạo thông tin dự án thông qua command init. yarn sẽ generate ra một file package.json chứa những thông tin config sau khi bạn đã trả lời những câu hỏi về dự án thông qua tương tác command line.
$ mkdir yarn_demo && cd yarn_demo
$ yarn init
yarn init v1.15.2
question name (yarn_demo):
question version (1.0.0):
question description:
question entry point (index.js):
question repository url:
question author:
question license (MIT):
question private:
success Saved package.json
✨  Done in 4.86s.

Hoặc có thể bỏ qua các câu hỏi bằng command: yarn init -y. Yarn sẽ generate với các trả lời mặc định. Ở bước này, một file package.json sẽ được tạo ra trong project.

Hai command tương tự khi sử dụng npm là:

$ npm init
$ npm init -y
  • Add một package, chẳng hạn như color, vào project đơn giản bằng command add:
$ yarn add color -D
yarn add v1.15.2
info No lockfile found.
[1/4] 🔍  Resolving packages...
[2/4] 🚚  Fetching packages...
[3/4] 🔗  Linking dependencies...
[4/4] 🔨  Building fresh packages...
success Saved lockfile.
success Saved 6 new dependencies.
info Direct dependencies
└─ color@3.1.0
info All dependencies
├─ color-convert@1.9.3
├─ color-name@1.1.3
├─ color-string@1.5.3
├─ color@3.1.0
├─ is-arrayish@0.3.2
└─ simple-swizzle@0.2.2
✨  Done in 0.92s.

Trong command trên, option -D nhằm chỉ định yarn lưu thông tin package vào object devDependencies trong file package.json

  • Nếu sau một thời gian, package color đang dùng trong ví dụ này ra version mới, thì chúng ta có thể dùng command upgrade để nâng cấp version.
$ yarn upgrade color
hoặc
$ npm update color
  • Gỡ package trong project bằng command remove:
$ yarn remove color
hoặc
$ npm uninstall color

File package.json

Có thể bạn sẽ nhận ra rằng những command bằng yarn hay npm trên đều tác động đến file package.json, đó là một file rất quan trọng trong Node project. Nó lưu những thông tin cấu hình của dự án, và nếu bạn làm việc trong một team thì file này sẽ giúp cho các member trong team cộng tác với nhau thuận lợi hơn bằng cách thống nhất các package sẽ được dùng cùng với thông tin version cụ thể. File package.json trong ví dụ trên sẽ trông như:

$ cat package.json
{
"name": "yarn_demo",
"version": "1.0.0",
"main": "index.js",
"license": "MIT",
"devDependencies": {
    "color": "^3.1.0"
 }
}

Bây giờ ta thử add thêm package chai vào project:

$ yarn add chai
yarn add v1.15.2
[1/4] 🔍  Resolving packages...
[2/4] 🚚  Fetching packages...
[3/4] 🔗  Linking dependencies...
[4/4] 🔨  Building fresh packages...
success Saved lockfile.
success Saved 7 new dependencies.
info Direct dependencies
└─ chai@4.2.0
info All dependencies
├─ assertion-error@1.1.0
├─ chai@4.2.0
├─ check-error@1.0.2
├─ deep-eql@3.0.1
├─ get-func-name@2.0.0
├─ pathval@1.1.0
└─ type-detect@4.0.8
✨  Done in 1.44s.

File package.json lúc này sẽ có nội dung:

$ cat package.json
{
  "name": "yarn_demo",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT",
  "devDependencies": {
    "color": "^3.1.0"
  },
  "dependencies": {
    "chai": "^4.2.0"
  }
}

Ở đây có hai loại dependencies. devDependencies là những gói phụ thuộc mà bạn cần có trong quá trình development. Còn dependencies là những gói phụ thuộc mà project cần có để có thể hoạt động.

Ngoài ra, ta cũng có thể thêm vào file package.json object scripts và định nghĩa một số script để thay thế cho các command thường dùng. Phần này sẽ nói rõ ở các bài sau.

Thư mục "node_modules"

Đây là thư mục quan trọng trong Node project có chứa những file thực thi, thư viện, framework... nói chung là mọi thứ bạn cài đặt đều được chứa trong thư mục này. Có một cách thường được dùng để clean project là xóa thư mục này và cài đặt lại mới như sau:

$ rm -rf node_modules/
$ yarn install
yarn install v1.15.2
[1/4] 🔍  Resolving packages...
[2/4] 🚚  Fetching packages...
[3/4] 🔗  Linking dependencies...
[4/4] 🔨  Building fresh packages...

✨  Done in 0.20s.