Thứ hai, 04/12/2017 | 00:00 GMT+7

Sử dụng tập lệnh npm trong quá trình phát triển


Là các nhà phát triển trong thời hiện đại, ta có quyền truy cập ngày càng nhiều công cụ để cải thiện tốc độ và hiệu quả mà ta phát triển. Có lẽ một trong những yếu tố ảnh hưởng nhất đến sự phổ biến ngày càng tăng của Node.js và các công cụ Javascript backend khác là chúng cho phép ta sử dụng một cú pháp quen thuộc ở mọi giai đoạn phát triển.

Ví dụ, Taskrunners là các chương trình có mục đích duy nhất là tự động hóa các khía cạnh thông thường của quá trình phát triển. Có rất nhiều công cụ tạo và tạo tác vụ Javascript cực kỳ hữu ích, chẳng hạn như Grunt.js , Gulpwebpack . Mặc dù mạnh mẽ và vô giá để biết, có một công cụ khác không được chú ý nhiều nhưng hoạt động tương tự và có thể có giá trị tương đương để biết sâu, tính năng tập lệnh tích hợp của npm.

Ta hãy xem các cách khác nhau mà ta có thể sử dụng các tập lệnh npm để giúp hỗ trợ nhu cầu phát triển của bạn .

Package.json

Mọi dự án trong Node đều có file package.json chứa metadata về dự án. Trong file này, ta tìm thấy những thứ như tiêu đề, mô tả, version và phụ thuộc. Mục đích chính của file này là cho phép xuất bản dự án của ta trên npm. Khi ai đó muốn cài đặt chương trình của ta từ npm, hệ thống của họ cần biết các chương trình khác của ta phụ thuộc vào điều gì để chạy đúng cách. Nó cũng cần biết những điều nhất định về hành vi và cấu hình của chương trình. Nó lấy tất cả thông tin này từ file package.json .

Một file package.json điển hình có thể trông giống như sau:

{
  "name": "Crispy",
  "version": "1.0.0",
  "description": "Cooked to perfection!",
  "main": "index.js",
  "scripts": {
    "test": "mocha"
  },
  "author": "AlligatorIO",
  "license": "ISC",
  "dependencies": {
    "ws": "^3.3.2"
  },
  "devDependencies": {
    "webpack": "^3.8.1"
  }
}

Như bạn thấy , nó không khác gì một file chứa đối tượng JSON với thông tin liên quan đến dự án của ta .

Một phần của thông tin này là phần scripts . Các tập lệnh này là các lệnh sẽ được kích hoạt tại các thời điểm khác nhau trong suốt vòng đời phát triển và xuất bản. Hai trong số các tập lệnh npm phổ biến nhất là tập lệnh start và tập lệnh test . Bạn sẽ nhận thấy trong ví dụ trước rằng không có tập lệnh bắt đầu nào được xác định. Điều này là do npm có giá trị mặc định cho tập lệnh bắt đầu là node server.js . Điều này nghĩa là nếu ta không chọn xác định tập lệnh bắt đầu tùy chỉnh của riêng mình, nhập npm start vào dòng lệnh sẽ tự động tìm kiếm file có tên server.js và chạy file đó trong Node nếu được tìm thấy.

Cũng lưu ý giá trị của tập lệnh test của ta chỉ đơn giản là "mocha". Mocha là một bộ công cụ kiểm tra JavaScript phổ biến và sau khi cài đặt nó có thể được chạy đơn giản bằng cách sử dụng lệnh mocha trong dòng lệnh. Trong trường hợp này, tập lệnh thử nghiệm của ta không chỉ làm gì khác hơn.

Có nhiều tập lệnh npm khác nhau bao gồm nhiều trường hợp sử dụng, nhưng điều ta quan tâm nhất hiện tại là các cách khác nhau mà ta có thể sử dụng các tập lệnh này để giúp cuộc sống của ta dễ dàng hơn trong quá trình phát triển một dự án mới.

Hiểu về vòng đời

Key đầu tiên để mở ra sức mạnh của các tập lệnh npm là hiểu npm đang làm gì khi bạn chạy một tập lệnh. Điều đầu tiên nó làm là kiểm tra file package.json để xem bạn đã xác định giá trị cho tập lệnh đó chưa. Nếu nó nhận thấy rằng bạn có, nó sẽ tìm kiếm hai version khác của tập lệnh. Một version 'trước' và một version 'đăng'. Nếu nó tìm thấy một trong hai thứ này, nó sẽ chạy chúng theo tập lệnh được chỉ định.

Thí dụ:

{
  "scripts": {
    "prestart": "node loadJaw.js",
    "start": "node Gator.js",
    "poststart": "node bite.js"
  }
}

Nếu Đây là kết quả NPM đã tìm thấy trong file package.json của ta nó sẽ chạy các kịch bản theo thứ tự prestart , start , sau đó poststart . Tất cả những gì ta sẽ làm để kích hoạt điều này là nhập npm start trong dòng lệnh. Điều này cực kỳ hữu ích cho nhiều trường hợp mà bạn cần điều gì đó xảy ra ngay trước hoặc ngay sau một hành động chính. Trong quá trình phát triển, ta có thể cần kết nối để chạy bản sao local của database hoặc gói các file của bạn và ta cần đảm bảo những điều này xảy ra trước khi server của ta chạy để tránh lỗi.

Nếu ta cài đặt các tập lệnh của bạn đúng cách thì chỉ cần chạy lệnh npm start sẽ có thể xử lý tất cả các nhu cầu của ta theo thứ tự thích hợp.

Chế độ phát triển so với Chế độ production

Một trong những cách hữu ích nhất để sử dụng các tập lệnh npm là thay đổi giá trị của biến Node_ENV của Node có thể truy cập được trong bất kỳ chương trình Node nào thông qua biến Quy trình chung. Chỉ cần tham khảo process.env.Node_ENV để tìm giá trị của nó.

function getEnvironment(){
  return process.env.Node_ENV;
}

getEnvironment(); // returns 'production';

Nhiều khuôn khổ sử dụng giá trị của biến Node_ENV để xác định chạy ở chế độ phát triển hay chế độ production . Sự khác biệt là chế độ production đôi khi được tối ưu hóa cho hiệu suất, trong khi chế độ phát triển được tối ưu hóa để gỡ lỗi. Ta có thể sử dụng cơ chế chung này trong các dự án của riêng mình bằng cách viết các chương trình được cấu hình khác nhau tùy thuộc vào giá trị của biến Node_ENV .

Ví dụ: hãy tưởng tượng ta muốn ghi lại những người truy cập vào trang web của ta . Trong chế độ production , ta có thể chỉ muốn ghi địa chỉ IP của từng khách truy cập mới vào file log để tham khảo sau. Trong chế độ phát triển, ta có thể đang phân tích lưu lượng truy cập trong thời gian thực để tìm ra lỗi, vì vậy ta sẽ muốn ghi thông tin về những khách truy cập mới vào một file khác cũng như ghi lại lưu lượng truy cập vào console để ta có thể theo dõi khi nó xảy ra. Điều này có thể đơn giản như:

const fs = require('fs');
const inDevelopmentMode = process.env.Node_ENV === development;

function newVisitor(ip){
  let logMessage = "New Visitor IP: " + ip;

  if(inDevelopmentMode){
    fs.writeFile("development_log.txt", logMessage, (err) => {
      if(err) throw err;
    });
    console.log(logMessage);
  }
  else{
    fs.writeFile("production_log.txt", logMessage, (err) => {
      if(err) throw err;
    });
  }
}

Ở đây ta đang sử dụng module fs để tương tác với hệ thống file của ta . Ta đang tham chiếu đến biến Node_ENV để xác định xem ta có đang ở chế độ phát triển hay không và nếu có thì ghi cả vào file development_log.txt và console . Nếu ta đang ở chế độ production , nó sẽ chỉ cần đăng nhập vào file production_log.txt của ta mà không cần đăng nhập vào console .

Nhưng làm thế nào để ta thực sự thay đổi biến Node_ENV ? Một cách là sử dụng các tập lệnh npm! Trong file package.json của ta :

{
  "scripts": {
    "start": "SET Node_ENV=development& node server.js",
  }
}

Cú pháp có thể trông hơi buồn cười và gợi lên một số câu hỏi ngay từ cái nhìn đầu tiên. Đây là lời giải thích tại sao nó được thực hiện theo cách này. Có một số điều quan trọng nhưng không thể đoán trước được khi cố gắng thực hiện điều này.

  • Đặt biến Node_ENV ở một bước khác với bước dự định tương tác với nó có thể dẫn đến lỗi. Điều này là do mỗi khi một tập lệnh npm được chạy, nó được coi là một “quá trình” khác. Nếu ta thay đổi giá trị Node_ENV trong prestart kịch bản, nó sẽ không chuyển sang chế độ start quá trình kịch bản. Do đó, ta phải thay đổi nó trong tập lệnh start nếu ta định tương tác với nó trong file server.js của ta .

  • Có một chút khác biệt giữa cách Linux và Windows xử lý việc thay đổi biến. Trong Linux, bạn có thể bỏ qua lệnh SET và chỉ cần sử dụng Node_ENV=development& node server.js . Trong cửa sổ, bạn phải sử dụng lệnh SET để thay đổi biến.

  • Điều quan trọng là đảm bảo không có khoảng trống giữa development& trong dòng mã này, nếu không khoảng trắng đó sẽ là một phần của giá trị của biến và dẫn đến false khi kiểm tra process.env.Node_ENV === "development" .

Tất nhiên sự khác biệt giữa cách Linux và Windows cài đặt biến môi trường có thể dẫn đến sự không tương thích nếu một group đang làm việc trên một dự án từ cả hai hệ điều hành. Có một số cách để xử lý điều này. Bạn có thể sử dụng một tập lệnh hoặc module như cross-env để cố gắng xác định hệ điều hành mà chương trình đang chạy trước khi chạy lệnh hoặc bạn có thể có các tập lệnh npm khác nhau để sử dụng cho mỗi hệ điều hành và để các nhà phát triển nhớ cái nào để sử dụng. Cả hai cách đều hợp lệ, nhưng ta sẽ tạo ra các tập lệnh npm thay thế làm những việc tương tự cho các ngữ cảnh khác nhau như thế nào?

Kịch bản tùy ý

May mắn là npm cung cấp một cách tích hợp để thực hiện điều này bằng cách cho phép ta xác định các tập lệnh tùy ý tùy chỉnh của riêng mình. Ta có thể đặt tên cho các script này là bất cứ thứ gì ta muốn và npm sẽ vẫn chạy chúng chính xác như ta mong đợi. Nó vẫn sẽ cố gắng chạy tất cả các biến thể trong vòng đời của tập lệnh khi được kích hoạt, bằng cách thêm “trước” và “đăng” vào tên được cung cấp. Điều này cho phép ta có bất kỳ số lượng tập lệnh tùy chỉnh nào mà ta có thể sử dụng trong khi phát triển. Chỉ có một sự khác biệt chính và đó là cách ta kích hoạt tập lệnh từ dòng lệnh.

Đối với mỗi tập lệnh npm được hỗ trợ nguyên bản, ta nhập npm <script-name> , để kích hoạt một tập lệnh tùy ý, ta cần sử dụng npm run <script-name> . Đó là sự khác biệt duy nhất. Nếu ta cần một tập lệnh bắt đầu đã sửa đổi để user Linux làm việc với ta , ta có thể tạo một tập lệnh loại bỏ lệnh SET khỏi tập lệnh bắt đầu và đặt tên nó là bất kỳ thứ gì ta chọn.

Và nếu ta muốn có một tập lệnh tùy chỉnh để chạy một version MongoDB local , ta có thể chỉ cần làm điều gì đó như sau:

{
  "scripts": {
    "start": "SET Node_ENV=development& node server.js",
    "mongo": "mongod --dbpath=./pathToDatabase/db"
  }
}

Bây giờ ta có thể sử dụng npm run mongo để chạy database .

Các tập lệnh tùy ý rất tốt để kích hoạt các chuỗi lệnh khác nhau theo ý muốn. Lấy ví dụ:

{
  "scripts": {
    "test": "mocha",
    "start": "SET Node_ENV=development& node server.js",
    "mongo": "mongod --dbpath=./pathToDatabase/db",
    "launch": "npm test && npm run mongo && npm start",
  }
}

Ở đây ta có một tập lệnh chạy kích hoạt các tập lệnh thử nghiệm, mongo và bắt đầu của ta theo thứ tự đó. Ta cũng có thể sử dụng các gói như đồng thời trong các tập lệnh của bạn để chạy các hành động đồng thời.

{
  "scripts": {
    "start": "concurrently \"node grip.js bacon\" \"node bite.js bacon\""
  }
}

Lời kết

Hy vọng rằng việc đọc phần này đã cung cấp cho bạn một số ý tưởng về cách bạn có thể sử dụng các tập lệnh npm để hỗ trợ quy trình phát triển của bạn ! Cá nhân tôi thích có tôi start kịch bản kích hoạt một môi trường production và tạo ra một tùy dev script để kích hoạt một môi trường phát triển. Bằng cách này, tôi không cần phải thay đổi bất kỳ thứ gì khác trong package.json để chuyển về chế độ production khi tôi đã sẵn sàng, nó đơn giản như sử dụng npm start .


Tags:

Các tin liên quan