Tìm hiểu về Node.js CLI và các comand line options hỗ trợ debug
Bài đăng này đã không được cập nhật trong 7 năm
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