2012-06-19 37 views
10

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.

+0

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'); }; –

Trả lời

7

Tôi vừa thêm tùy chọn vào lệnh mksnapshot (chạy trong khi bạn đang xây dựng V8). Cờ --extra-file = filename.js mới cho phép bạn chỉ định một tệp sẽ được tải và chạy trong tiến trình và sau đó đặt vào ảnh chụp nhanh. Nó nằm trên phiên bản trục của V8, không phải là nhánh 3.11 đang được sử dụng cho nút 0.8, do đó bạn sẽ phải chạy nút 0.8 với phiên bản V8 3.11. Theo như tôi biết tại thời điểm này hoạt động, nhưng bạn sẽ có phần nào của riêng bạn.

Vui lòng gửi lỗi nếu bạn dùng thử và nó không hoạt động cho bạn.

+2

Cảm ơn, user487683, tùy chọn mới phù hợp với tôi. Đối với hậu thế, các thay đổi của bạn nằm trong bản sửa đổi này: http://code.google.com/p/v8/source/detail?r=11871. Để thêm mã phụ vào quá trình xây dựng, tôi đã thay đổi định nghĩa của env.Snapshot trên dòng 343 của SconScript thành 'env ['BUILDERS'] ['Ảnh chụp'] = Builder (action = '$ SOURCE $ TARGET --logfile" $ LOGFILE "--log-snapshot-positions --extra-code" đường dẫn/đến/file.js "')'. Dường như tệp được thực thi sau khi các tệp thư viện được liệt kê trong SconScript, vì vậy nó có thể sửa đổi các đối tượng mà chúng giới thiệu. Tuy nhiên nó được thực hiện trước bất cứ điều gì trong Node. –

Các vấn đề liên quan