Tôi có một ứng dụng node.js (v0.6.12) bắt đầu bằng cách đánh giá tệp Javascript, startup.js. Phải mất một thời gian dài để đánh giá startup.js và tôi muốn 'bake it in' vào một bản dựng tùy chỉnh của Node nếu có thể.Node.js/v8: Cách tạo ảnh chụp nhanh của riêng tôi để tăng tốc khởi động
Thư mục nguồn v8 được phân phối với Nút, nút/deps/v8/src, chứa một SconScript có thể được sử dụng để thực hiện việc này. Trên dòng 302, chúng tôi có
LIBRARY_FILES = '''
runtime.js
v8natives.js
array.js
string.js
uri.js
math.js
messages.js
apinatives.js
date.js
regexp.js
json.js
liveedit-debugger.js
mirror-debugger.js
debug-debugger.js
'''.split()
Các tệp javascript đó có trong cùng một thư mục. Một cái gì đó trong quá trình xây dựng dường như đánh giá họ, có một bản chụp trạng thái, và lưu nó như là một chuỗi byte trong nút/out/Release/obj/release/snapshot.cc (trên Mac OS). Tập tin này dường như được nướng thành Node.
Một số tùy chỉnh của ảnh chụp nhanh khởi động có thể bằng cách thay đổi SconScript. Ví dụ, tôi có thể thay đổi định nghĩa của Date.toString dựng sẵn bằng cách thay đổi date.js. Tôi thậm chí có thể thêm các biến toàn cục mới bằng cách thêm tệp startup.js vào danh sách tệp thư viện, với nội dung global.test = 1
.
Tuy nhiên, tôi không thể chỉ đặt bất kỳ mã javascript nào trong startup.js
. Nếu nó chứa Date.toString = 1;
, kết quả một lỗi mặc dù các mã có giá trị tại repl nút:
Build failed: -> task failed (err #2):
{task: libv8.a SConstruct -> libv8.a}
make: *** [program] Error 1
Và nó rõ ràng là không thể làm cho việc sử dụng mã mà phụ thuộc vào thư viện Node thêm vào động cơ V8. global.underscore = require('underscore');
gây ra lỗi tương tự.
Tôi lý tưởng giống như công cụ, customSnapshot, trong đó customSnapshot startup.js
đánh giá startup.js bằng nút Node và sau đó đổ một ảnh chụp nhanh vào tệp, snapshot.cc, mà tôi có thể đưa vào thư mục nguồn nút. Sau đó tôi có thể xây dựng nút và yêu cầu nó không xây dựng lại ảnh chụp nhanh.
Thực ra phương pháp này hoạt động tốt cho tôi và tôi đã sử dụng node.js v0.8.11 đi kèm với v8 v3.11.10. Sự khác biệt là tôi đã sử dụng bản dựng dựa trên gyp mới. [Ở đây] (https://github.com/tarruda/node/commit/2f58630e66e2de4cbadae09ac37da55721de7bd3) bạn có thể thấy những thay đổi cần thiết. Như bạn đã nói, bạn không thể gọi mã phụ thuộc vào các đối tượng dựng sẵn hoặc các hàm nút (console, yêu cầu ...). Bạn có thể làm việc xung quanh đó bằng cách sử dụng hàm khởi tạo ann: var global = this; global.initialize = function() { global.console.log ('Hello node'); }; –