Tìm hiểu về Node.js CLI và các comand line options hỗ trợ debug

Node.js hỗ trợ khá nhiều các options CLI cho phép chúng ta sử dụng những công cụ built-in trong node.js để debug. Ngoài ra còn có một số options cho phép chúng ta tùy chỉnh V8 engine phù hợp với nhu cầu debug của mình. Trong bài này chúng ta sẽ cùng tìm hiểu một số options quan trọng giúp chúng ta có thể làm việc hiệu quả hơn nhé.

Kiểm tra các CLI options được Node.js hỗ trợ

Để lấy ra các danh sách options được hỗ trợ cũng như mô tả về các options, chúng ta có thể xem help hoặc manual của Node.js ngay tại terminal của mình:

node -h

hoặc

man node

Dưới đây là danh sách các options và mô tả ngắn gọn về các options trong Node.js

Usage: node [options] [ -e script | script.js ] [arguments] 
       node debug script.js [arguments] 

Options:
  -v, --version         print Node.js version
  -e, --eval script     evaluate script
  -p, --print           evaluate script and print result
  -c, --check           syntax check script without executing
  -i, --interactive     always enter the REPL even if stdin
                        does not appear to be a terminal
  -r, --require         module to preload (option can be repeated)
  --no-deprecation      silence deprecation warnings
  --trace-deprecation   show stack traces on deprecations
  --throw-deprecation   throw an exception anytime a deprecated function is used
  --no-warnings         silence all process warnings
  --trace-warnings      show stack traces on process warnings
  --trace-sync-io       show stack trace when use of sync IO
                        is detected after the first tick
  --track-heap-objects  track heap object allocations for heap snapshots
  --prof-process        process v8 profiler output generated
                        using --prof
  --zero-fill-buffers   automatically zero-fill all newly allocated
                        Buffer and SlowBuffer instances
  --v8-options          print v8 command line options
  --v8-pool-size=num    set v8's thread pool size
  --tls-cipher-list=val use an alternative default TLS cipher list
  --openssl-config=path load OpenSSL configuration file from the
                        specified path
  --icu-data-dir=dir    set ICU data load path to dir
                        (overrides NODE_ICU_DATA)
  --preserve-symlinks   preserve symbolic links when resolving
                        and caching modules.

Environment variables:
NODE_PATH                ':'-separated list of directories
                         prefixed to the module search path.
NODE_DISABLE_COLORS      set to 1 to disable colors in the REPL
NODE_ICU_DATA            data path for ICU (Intl object) data
NODE_NO_WARNINGS           set to 1 to silence process warnings
NODE_PATH               ':'-separated list of directories
                        prefixed to the module search path
NODE_REPL_HISTORY       path to the persistent REPL history file

Documentation can be found at https://nodejs.org/

Usage

--version Kiểm tra phiên bản Node.js: kết quả v6.10.1

node -v

hoặc

node --version

--eval Chạy thử một đoạn mã JS ngay từ terminal mà không cần tạo file. Với những module đã được định nghĩa trước trong REPL thì chúng ta có thể sử dụng ngay trong option này mà không cần require. Ví dụ: fs http os path

node -e 'console.log("Hello from Node.js")'

hoặc

node --eval 'console.log("Hello from Node.js")'

--print Hoạt động tương tự với --eval. Tuy nhiên với --print kết quả của đoạn mã js sẽ được in ra ngay terminal mà không cần dùng console.log. Hai cách làm dưới đây cho kết quả giống nhau

node -e 'console.log(1+2)'
node -p '1+2'

--check Kiểm tra cú pháp một file mà không cần phải chạy file đó. --check khá hữu dụng trong trường hợp bạn muốn kiểm tra đoạn code vừa viết có đúng cú pháp hay không mà không cần phải chạy cả project. Nếu file được check có lỗi, nó sẽ được hiển thị trên terminal y hệt như cách nó sẽ hiển thị khi bạn chạy project bị lỗi

node -c ./test.js

--inspect[=host:port] (require node v6.3.0) Kích hoạt chế độ inspector của Node.js, dùng để debug ứng dụng thông qua Chrome Debugging Protocol --inspect-brk[=host:port] (require node v7.6.0) Tương tự như -inspect[=host:port] nhưng khi chạy nó sẽ tạp dừng việc thực thi ngay tại dòng đầu tiên của ứng dụng và in ra một đường link debug. Sau khi có link đó ta chỉ cần copy paste lên browser để bắt đầu debug --zero-fill-buffers (require node v6.0.0) Một ứng dụng Node.js có thể được chạy với option --zero-fill-buffers. Khi làm như thế thì tất cả các Buffer instances mới được phân bổ sẽ bị ép zero-filled ngay khi chúng được khởi tạo. Lý do cho việc làm này nằm ở: các Buffer instances mới được phân bổ có thể tồn tại dữ liệu nhạy cảm; và chúng ta cần thiết phải ép buộc chúng không được tồn tại dữ liệu nhạy cảm. Điều này tác động nhiều đến performance của ứng dụng --prof-process Profiling ửng dụng thông qua V8 profiler log. Để có thể thực hiện profiling với option này, trước tiên chúng ta phải chạy ứng dụng với option --prof. Khi làm như thế, Node.js sẽ in ra output của V8 Profiler Log, dựa vào log đó chúng ta sẽ thực hiện prof-process để đánh giá performance B1.

node --prof abc.js

Sau khi chạy xong, một file với tiền tố isolate- sẽ được tạo ngay ở thư mục ứng dụng (thư mục chứa file abc.js). Khi đã có file log V8 rồi, chúng ta sẽ chạy node với option --prof-process để đưa ra kết quả

node --prof-process isolate-0x21fd250-v8.log > output.txt

File output.txt trả về sẽ cho chúng ta các số liệu từ V8 Profiler như thời gian C++, javascript thực thi, mỗi lượt gọi hàm thực thi hết bao lâu...Các số liệu này có thể được dùng trong một số công cụ đánh giá performance metrics để xuất ra những biểu đồ trực quan giúp chúng ta dễ dàng đánh giá nhứng điểm bottleneck trong ứng dụng của mình hơn

Statistical profiling result from isolate-0x21fd250-v8.log, (3880 ticks, 316 unaccounted, 0 excluded).

 [Shared libraries]:
   ticks  total  nonlib   name
    231    6.0%          /usr/bin/nodejs
     97    2.5%          /lib/x86_64-linux-gnu/libc-2.23.so
     15    0.4%          /lib/x86_64-linux-gnu/libpthread-2.23.so
      2    0.1%          /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21
      1    0.0%          [vdso]

 [JavaScript]:
   ticks  total  nonlib   name
     44    1.1%    1.2%  LazyCompile: formatValue util.js:298:21
     25    0.6%    0.7%  Builtin: CallFunction_ReceiverIsNotNullOrUndefined
     23    0.6%    0.7%  Stub: LoadICStub
     20    0.5%    0.6%  Builtin: CallFunction_ReceiverIsAny
     18    0.5%    0.5%  Stub: CEntryStub
     18    0.5%    0.5%  KeyedLoadIC: A keyed load IC from the snapshot
     16    0.4%    0.5%  Stub: StringAddStub_CheckNone_NotTenured
     15    0.4%    0.4%  LazyCompile: *normalizeStringPosix path.js:78:30
     12    0.3%    0.3%  LazyCompile: *formatProperty util.js:764:24
     11    0.3%    0.3%  Stub: VectorStoreICStub
     11    0.3%    0.3%  LazyCompile: ~[Symbol.replace] native regexp.js:659:31
     11    0.3%    0.3%  Builtin: ArgumentsAdaptorTrampoline
     10    0.3%    0.3%  KeyedStoreIC: A keyed store IC from the snapshot {2}
     10    0.3%    0.3%  Builtin: ObjectHasOwnProperty
      8    0.2%    0.2%  Stub: SubStringStub
      8    0.2%    0.2%  KeyedLoadIC: A keyed load IC from the snapshot {1}
      7    0.2%    0.2%  Stub: GrowArrayElementsStub
      6    0.2%    0.2%  Stub: ToStringStub
      6    0.2%    0.2%  Stub: InstanceOfStub
      6    0.2%    0.2%  LazyCompile: *xor /home/nguyen.ngoc.phuong/Documents/projects/laco/node_modules/laco/node_modules/mongodb-core/lib/auth/scram.js:61:19
      6    0.2%    0.2%  LazyCompile: *exec native regexp.js:116:30
      6    0.2%    0.2%  LazyCompile: *Uint8ArrayConstructByArrayBuffer native typedarray.js:144:42
     ...
 [C++]:
   ticks  total  nonlib   name
    609   15.7%   17.2%  node::ContextifyScript::New(v8::FunctionCallbackInfo<v8::Value> const&)
     83    2.1%    2.3%  write
     49    1.3%    1.4%  __xstat
     33    0.9%    0.9%  void v8::internal::LookupIterator::Start<false>()
     33    0.9%    0.9%  int v8::internal::BinarySearch<(v8::internal::SearchMode)1, v8::internal::DescriptorArray>(v8::internal::DescriptorArray*, v8::internal::Name*, int, int*)

V8 Options

--harmony Kích hoạt tất cả các tính năng có tại thời điểm chuyển giao phiên bản, chưa được active mặc định --max_old_space_size Thay đổi size tối đa của Old space (tìm hiểu thêm về Old space ). Option này làm ảnh hưởng trực tiếp đến lượng ram tối đa ứng dụng của bạn có thể chiếm --optimize_for_size Option này cho phép V8 tối tư dung lượng sử dụng, có thể làm cho ứng dụng của bạn chậm đi

Biến môi trường

NODE_DEBUG Thay đổi biến mỗi trường sẽ thay đổi cách mà các core module hiển thị thông tin debug (tùy theo môi trường) NODE_PATH Địa chỉ sẽ lưu trữ các module trong node.js, nhờ vào đó mà Node.js có thể tìm kiếm các module không nằm trong node_modules của ứng dụng OPENSSL_CONF File cấu hình OpenSsl sẽ được Node.js sử dụng

Tham khảo thêm

https://nodejs.org/dist/latest-v7.x/docs/api/cli.html#cli_environment_variables https://nodejs.org/dist/latest-v7.x/docs/api/cli.html#cli_command_line_options https://snyk.io/blog/exploiting-buffer/ https://chromedevtools.github.io/devtools-protocol/

All Rights Reserved