Câu trả lời:
Vẫn không có gì tích hợp để cung cấp chức năng chính xác mà bạn mô tả. Tuy nhiên, một cách khác để sử dụng require
nó để sử dụng .load
lệnh trong REPL, như:
.load foo.js
Nó tải tập tin theo từng dòng giống như bạn đã gõ nó trong REPL. Không giống như require
điều này gây ô nhiễm lịch sử REPL với các lệnh bạn đã tải. Tuy nhiên, nó có lợi thế là có thể lặp lại vì nó không được lưu trữ như thế nào require
.
Cái nào tốt hơn cho bạn sẽ phụ thuộc vào trường hợp sử dụng của bạn.
Chỉnh sửa: Nó có khả năng áp dụng hạn chế vì nó không hoạt động ở chế độ nghiêm ngặt, nhưng ba năm sau tôi đã biết rằng nếu tập lệnh của bạn không có 'use strict'
, bạn có thể sử dụng eval
để tải tập lệnh của mình mà không làm ô nhiễm lịch sử REPL:
var fs = require('fs');
eval(fs.readFileSync('foo.js').toString())
tôi luôn sử dụng lệnh này
node -i -e "$(< yourScript.js)"
hoạt động chính xác như trong Python mà không cần bất kỳ gói nào.
Tôi đã tạo Vorpal.js , xử lý vấn đề này bằng cách biến nút thêm của bạn thành CLI tương tác. Nó hỗ trợ tiện ích mở rộng REPL, giúp bạn thả REPL trong bối cảnh ứng dụng đang chạy.
var vorpal = require('vorpal')();
var repl = require('vorpal-repl');
vorpal
.delimiter('myapp>')
.use(repl)
.show()
.parse(process.argv);
Sau đó, bạn có thể chạy ứng dụng và nó sẽ rơi vào REPL.
$ node myapp.js repl
myapp> repl:
Một cách khác là xác định các chức năng đó là toàn cầu.
global.helloWorld = function() { console.log("Hello World"); }
Sau đó tải trước tệp trong REPL dưới dạng:
node -r ./file.js
Sau đó, chức năng helloWorld
có thể được truy cập trực tiếp trong REPL.
Tôi đã tạo replpad vì tôi cảm thấy mệt mỏi khi tải lại tập lệnh nhiều lần.
Đơn giản chỉ cần cài đặt nó qua: npm install -g replpad
Sau đó sử dụng nó bằng cách chạy: replpad
Nếu bạn muốn nó xem tất cả các tệp trong hiện tại và tất cả các thư mục con và đưa chúng vào thay thế khi chúng thay đổi, hãy làm: replpad .
Kiểm tra các video trên trang web để có ý tưởng tốt hơn về cách thức hoạt động và tìm hiểu về một số tính năng hay khác mà nó có như sau:
dox()
chức năng được thêm vào mọi chức năng cốt lõi, nghĩa làfs.readdir.dox()
dox()
chức năng được thêm vào mỗi mô-đun được cài đặt qua npm, tức làmarked.dox()
src
tính được thêm vào mọi hàm, nghĩa làexpress.logger.src
.talk
lệnh).append
lệnhCXX=clang++ npm install replpad
phục lỗig++: error: unrecognized command line option '-stdlib=libc++'
# # Fatal error in ../deps/v8/src/api.cc, line 1248 # Check failed: !value_obj->IsJSReceiver() || value_obj->IsTemplateInfo(). # Illegal instruction: 4
Tại sao không tải tập tin vào một nút tương tác thay thế?
node -h
-e, --eval script evaluate script
-i, --interactive always enter the REPL even if stdin
node -e 'var client = require("./build/main/index.js"); console.log("Use `client` in repl")' -i
Sau đó, bạn có thể thêm vào script.json
"repl": "node -e 'var client = require(\"./build/main/index.js\"); console.log(\"Use `client` in repl\")' -i",
thử nghiệm bằng nút v8.1.2
node -i -r "./build/main/index.js"
?
Hiện tại bạn không thể làm điều đó trực tiếp, nhưng bạn có thể mylib = require('./foo.js')
trong REPL. Ghi nhớ các phương thức được xuất, không được khai báo là toàn cục.
.load my_work.js
, mặc dù yêu cầu một số exports.working_var = ...
khai báo bổ sung , bởi vì các barf REPL trên một số loại javascript hoàn toàn hợp lệ, như các bình luận đa dòng (ít nhất là với readline
cấu hình của tôi ).
replpad
Thật tuyệt, nhưng để tải tệp vào nút nhanh chóng và dễ dàng, nhập biến của nó và bắt đầu thay thế, bạn có thể thêm đoạn mã sau vào cuối tệp .js của mình
if (require.main === module){
(function() {
var _context = require('repl').start({prompt: '$> '}).context;
var scope = require('lexical-scope')(require('fs').readFileSync(__filename));
for (var name in scope.locals[''] )
_context[scope.locals[''][name]] = eval(scope.locals[''][name]);
for (name in scope.globals.exported)
_context[scope.globals.exported[name]] = eval(scope.globals.exported[name]);
})();
}
Bây giờ nếu tệp của bạn đang src.js
chạy, node src.js
sẽ khởi động nút, tải tệp, bắt đầu REPL và sao chép tất cả các đối tượng được khai báo var
ở cấp cao nhất cũng như bất kỳ toàn cầu xuất nào. Việc if (require.main === module)
đảm bảo rằng mã này sẽ không được thực thi nếu src.js
được đưa vào thông qua một require
câu lệnh. Tôi thực tế, bạn có thể thêm bất kỳ mã nào bạn muốn được loại bỏ khi bạn đang chạy src.js
độc lập cho mục đích gỡ lỗi bên trong if
câu lệnh.
Đây là phiên bản hàm bash của câu trả lời của George :
noderepl() {
FILE_CONTENTS="$(< $1 )"
node -i -e "$FILE_CONTENTS"
}
Nếu bạn đặt cái này vào, ~/.bash_profile
bạn có thể sử dụng nó như một bí danh, nghĩa là:
noderepl foo.js
Một đề nghị khác mà tôi không thấy ở đây: hãy thử một chút mã này
#!/usr/bin/env node
'use strict';
const repl = require('repl');
const cli = repl.start({ replMode: repl.REPL_MODE_STRICT });
cli.context.foo = require('./foo'); // injects it into the repl
Sau đó, bạn có thể chỉ cần chạy tập lệnh này và nó sẽ bao gồm foo
như một biến
Câu trả lời cũ
type test.js|node -i
Sẽ mở nút REPL và nhập tất cả các dòng từ test.js vào REPL, nhưng vì một số lý do, nút sẽ thoát sau khi tệp kết thúc
Một vấn đề khác là, các chức năng đó sẽ không được nâng lên.
node -e require('repl').start({useGlobal:true}); -r ./test2.js
Sau đó, tất cả các quả cầu được khai báo không có var trong test2.js sẽ có sẵn trong REPL
không chắc chắn tại sao var a trong phạm vi toàn cầu sẽ không có sẵn