Giới thiệu
Khi bắt đầu một dự án mới trong Raku với Cro, tôi thường hình dung ra hai hoặc ba route, một định dạng phản hồi, có thể là một đoạn mã được kiểu hóa. Trong thế giới Perl, tôi đã dựa rất nhiều vào Mojolicious::Lite trong giai đoạn prototyping. Tuy nhiên, trong Cro—mặc dù mạnh mẽ và mô-đun—tôi cảm thấy thiếu một “chế độ nhẹ” ngay lập tức: không cần phải kết nối thủ công server, pipeline và router chỉ để thử nghiệm một ý tưởng. Từ những khó khăn đó, Crolite ra đời: một lớp mỏng giúp tái xuất các từ khóa định tuyến của Cro và thêm một MAIN đa dạng với các lệnh khám phá nhanh chóng.
Crolite là gì?
- Mục tiêu: Làm cho việc tạo mẫu HTTP tối thiểu trở nên dễ dàng trong khi ý tưởng đang phát triển.
- Cách tiếp cận: Tái sử dụng router của Cro trực tiếp; không cần DSL mới.
- Sản phẩm: Một
RouteSetđược tập hợp + một CLI nhúng nhỏ. - Triết lý: “Bắt đầu ngay; tốt nghiệp sau với một ứng dụng Cro đầy đủ.”
Cài đặt
Từ một checkout cục bộ (trong thư mục dự án):
zef install .
Khi đã được xuất bản:
zef install Crolite
Ví dụ đầu tiên
Tạo file example.raku:
use Crolite;
get -> $any {
content 'text/plain', "Xin chào: $any";
}
delete -> 'thing', Int $id {
content 'application/json', %( :$id );
}
Liệt kê các route đã được tạo:
raku example.raku routes
Chạy server phát triển:
raku example.raku daemon --host=127.0.0.1 --port=3000
Kiểm tra một route mà không cần daemon cố định (yêu cầu tạm thời trong bộ nhớ):
raku example.raku GET /thing/42
Quy trình làm việc đề xuất
- Phác thảo các route và định dạng phản hồi.
- Chạy
raku app.raku routesđể xác nhận các mẫu. - Gửi yêu cầu đơn lẻ:
raku app.raku GET /foo/123. - Lặp lại cho đến khi ổn định.
- Nâng cấp lên một dự án Cro đầy đủ nếu bạn cần middleware phong phú hơn, logging có cấu trúc, TLS, v.v.
Tùy chọn CLI
| Lệnh | Mục đích |
|---|---|
routes |
In tóm tắt các điểm cuối đã đăng ký |
daemon [--host=0.0.0.0] [--port=10000] |
Khởi động server Cro đơn giản |
GET <path> |
Lấy GET trong bộ nhớ đơn lẻ |
POST <path> |
Gửi POST đơn lẻ (không có body tùy chỉnh) |
PUT <path> |
Gửi PUT đơn lẻ |
DELETE <path> |
Gửi DELETE đơn lẻ |
http <path> --method=<VERB> |
Hình thức tổng quát cho bất kỳ phương thức nào |
Dừng daemon bằng Ctrl+C (SIGINT sẽ bị bắt để tắt an toàn).
Các đoạn động và kiểu dữ liệu
use Crolite;
get -> 'greet', Str $name {
content 'text/plain', "Chào $name!";
}
post -> 'sum', Int $a, Int $b {
content 'application/json', %( total => $a + $b );
}
Kiểm tra:
raku app.raku GET /greet/Ana
raku app.raku POST /sum/2/5
Trả về JSON
Chỉ cần tạo ra một Hash hoặc Map:
get -> 'status' {
content 'application/json', %( service => 'ok', ts => DateTime.now );
}
Hooks (Trước / Sau)
Nếu bạn thêm thủ công các handler before hoặc after vào RouteSet cơ bản, Crolite sẽ bao gồm chúng khi kết hợp ứng dụng cho daemon:
use Crolite;
$*CRO-ROUTE-SET.before: {
# Nhúng logging / auth đơn giản
proceed;
}
get -> 'ping' { content 'text/plain', 'pong' }
Ví dụ hoàn chỉnh hơn
use Crolite;
get -> 'health' {
content 'application/json', %( ok => True );
}
put -> 'echo', Str $msg {
content 'text/plain', $msg.uc;
}
post -> 'calc', Int $x, Int $y {
content 'application/json', %( sum => $x + $y, prod => $x * $y );
}
delete -> 'soft', Int $id {
content 'application/json', %( deleted => $id, soft => True );
}
Kiểm tra nhanh:
raku app.raku GET /health
Chạy server:
raku app.raku daemon --port=4000
Tính năng thân thiện trong quá trình tạo mẫu
- Thay đổi nhanh: Lưu & chạy lại; chưa có auto-reloader.
- Kiểm tra:
routessẽ hiển thị ngay lập tức các lỗi chính tả đường dẫn. - Yêu cầu nguyên tử: Tránh mở terminal khác chỉ để sử dụng
curlđể xem nội dung.
Giới hạn hiện tại
- Không có logging có cấu trúc sẵn.
- Không có TLS / websockets / preset streaming tích hợp.
- Không có hot reload.
- API thử nghiệm (có thể thay đổi).
Khi nào nên chuyển sang ứng dụng Cro đầy đủ
- Bạn cần middleware chuỗi (auth, tracing, giới hạn tốc độ).
- Bạn yêu cầu phân tích / tùy chỉnh định dạng body phong phú hơn.
- Bạn tích hợp nhiều dịch vụ hoặc thành phần được giám sát.
- Bạn cần khả năng quan sát (metrics, distributed tracing, logging nâng cao).
Lộ trình tương lai có thể
- Reload tùy chọn trong chế độ
daemon. - Đầu ra bảng thay thế cho
routes. - Trợ giúp đo độ trễ / metrics nhẹ.
- Tạo skeleton test cho giai đoạn nâng cấp.
Mẹo thử nghiệm nhanh
- Sử dụng CLI nhúng để xác thực hợp đồng trước khi thử nghiệm chính thức.
- Khi chính thức hóa, tái sử dụng
Cro::HTTP::Test(phản ánh những gì các động từ CLI thực hiện).
Kết luận
Crolite không cạnh tranh với sự linh hoạt đầy đủ của một dự án Cro có cấu trúc; nó giảm thời gian phản hồi hữu ích đầu tiên khi khám phá các ý tưởng HTTP trong Raku. Nếu bạn cũng cảm thấy thiếu sự nhẹ nhàng của Mojolicious::Lite, hãy thử bước đầu tiên của mỗi spike chỉ đơn giản là:
use Crolite;
Sau đó, khi hình dạng đã cứng lại, nâng cấp lên thứ gì đó mạnh mẽ hơn.
Gợi ý, vấn đề và PR đều được chào đón.