Sử dụng HTML trong Express thay vì Jade


103

Làm cách nào để thoát khỏi Jade khi sử dụng Express với Node.JS? Tôi chỉ muốn sử dụng html đơn giản. Trong các bài viết khác, tôi đã thấy rằng mọi người đã đề xuất app.register () hiện không được dùng nữa trong phiên bản mới nhất.

Câu trả lời:


78

Bạn có thể làm theo cách này:

  1. Cài đặt ejs:

    npm install ejs
  2. Đặt công cụ mẫu của bạn trong app.js dưới dạng ejs

    // app.js
    app.engine('html', require('ejs').renderFile);
    app.set('view engine', 'html');
  3. Bây giờ trong tệp tuyến đường của bạn, bạn có thể chỉ định các biến mẫu

    // ./routes/index.js
    exports.index = function(req, res){
    res.render('index', { title: 'ejs' });};
  4. Sau đó, bạn có thể tạo chế độ xem html của mình trong thư mục / views.


2
Tôi vừa mới bắt đầu sử dụng node.js. Giải pháp là không rõ ràng với tôi. Tôi có một trang web html nhỏ. Tôi cần node.js để gửi email thông qua trang web của mình bằng cách sử dụng gật đầu. Tôi đã cài đặt mọi thứ cần thiết. Tuy nhiên, phải có ý tưởng gì nên đi trong file app.js để làm cho tôi chạy trang web sử dụng nhanh
user2457956

4
Làm thế nào để in biến titletrong tệp html?
Master Yoda

3
Nếu ai vẫn còn tự hỏi làm thế nào để in các thay đổi, như @MasterYoda hỏi, bạn có thể in nó như thế này trên html: <% =% title>
Lucas Meine

62

Jade cũng chấp nhận đầu vào html.
Chỉ cần thêm một dấu chấm vào cuối dòng để bắt đầu gửi html thuần túy.
Nếu điều đó phù hợp với bạn thì hãy thử:

doctype html              
html. // THAT DOT
    <body>     
        <div>Hello, yes this is dog</div>
    </body>

Tái bút - Không cần đóng HTML - điều đó được Jade thực hiện tự động.


7
Doctype 5 hiện không được dùng nữa. Sử dụng "doctype html" làm dòng đầu tiên.
snorkelzebra


18

Kể từ Express 3, bạn có thể chỉ cần sử dụng response.sendFile

app.get('/', function (req, res) {
  res.sendfile(__dirname + '/index.html');
});)

Từ tham chiếu api express chính thức :

res.sendfile(path, [options], [fn]])

Chuyển tệp theo đường dẫn đã cho.

Tự động đặt mặc định trường tiêu đề phản hồi Loại-Nội dung dựa trên phần mở rộng của tên tệp. Lệnh gọi lại fn(err)được gọi khi quá trình chuyển hoàn tất hoặc khi xảy ra lỗi.

Cảnh báo

res.sendFilecung cấp bộ đệm phía máy khách thông qua tiêu đề bộ đệm http nhưng nó không lưu nội dung tệp vào bộ đệm phía máy chủ. Đoạn mã trên sẽ đánh vào đĩa theo từng yêu cầu .


2
Tôi tin rằng OP vẫn muốn sử dụng một số kiểu tạo mẫu, chỉ với cú pháp HTML thông thường. sendfilekhông cho phép bạn thực hiện bất kỳ quá trình tạo khuôn mẫu nào vì nó chỉ gửi các byte từ một tệp. Hơn nữa, tôi khuyên bạn không nên sử dụng sendfilenhư thế này vì nó có nghĩa là bạn sẽ đánh đĩa mỗi khi có yêu cầu - một nút cổ chai rất lớn. Đối với các trang có lưu lượng truy cập cao, bạn thực sự nên lưu vào bộ nhớ đệm trong bộ nhớ.
josh3736

1
@ josh3736 nếu bạn nói đúng về ý định OP, câu hỏi nên được cải thiện. Bạn nói đúng về việc đánh đĩa theo từng yêu cầu, tôi sẽ cải thiện câu trả lời của mình để cảnh báo về sự thật này. Vui lòng xem xét việc cải thiện công cụ của bạn để cảnh báo về những điều sau: nếu bạn triển khai một công cụ tùy chỉnh, bạn phải triển khai quá nhiều tính năng bắt (nếu muốn), nó không được xử lý bởi express.
laconbass

17

Theo ý kiến ​​của tôi, việc sử dụng một cái gì đó lớn như ejs chỉ để đọc các tệp html là hơi nặng tay. Tôi vừa viết công cụ mẫu của riêng mình cho các tệp html rất đơn giản. Tệp trông như thế này:

var fs = require('fs');
module.exports = function(path, options, fn){
    var cacheLocation = path + ':html';
    if(typeof module.exports.cache[cacheLocation] === "string"){
        return fn(null, module.exports.cache[cacheLocation]);
    }
    fs.readFile(path, 'utf8', function(err, data){
        if(err) { return fn(err); }
        return fn(null, module.exports.cache[cacheLocation] = data);
    });
}
module.exports.cache = {};

Tôi đã gọi là htmlEngine của tôi và cách bạn sử dụng nó chỉ đơn giản là nói:

app.engine('html', require('./htmlEngine'));
app.set('view engine', 'html');

11

app.register()vẫn chưa bị giảm giá, nó vừa được đổi tên thành app.engine()kể từ khi Express 3 thay đổi cách xử lý các công cụ mẫu .

Yêu cầu khả năng tương thích với công cụ mẫu Express 2.x khi xuất mô-đun sau:

exports.compile = function(templateString, options) {
    return a Function;
};

Các công cụ mẫu 3.x Express sẽ xuất các nội dung sau:

exports.__express = function(filename, options, callback) {
  callback(err, string);
};

Nếu một công cụ mẫu không hiển thị phương pháp này, bạn không gặp may, app.engine()phương pháp này cho phép bạn ánh xạ bất kỳ chức năng nào đến một tiện ích mở rộng. Giả sử bạn có một thư viện đánh dấu và muốn hiển thị các tệp .md, nhưng thư viện này không hỗ trợ Express, app.engine()lệnh gọi của bạn có thể trông giống như sau:

var markdown = require('some-markdown-library');
var fs = require('fs');

app.engine('md', function(path, options, fn){
  fs.readFile(path, 'utf8', function(err, str){
    if (err) return fn(err);
    str = markdown.parse(str).toString();
    fn(null, str);
  });
});

Nếu bạn đang tìm kiếm một công cụ tạo khuôn mẫu cho phép bạn sử dụng HTML 'thuần túy', tôi khuyên bạn nên làm doT vì nó cực kỳ nhanh .

Tất nhiên, hãy nhớ rằng mô hình chế độ xem Express 3 để lại bộ nhớ đệm chế độ xem tùy thuộc vào bạn (hoặc công cụ tạo khuôn mẫu của bạn). Trong môi trường sản xuất, bạn có thể muốn lưu các chế độ xem của mình vào bộ nhớ để bạn không thực hiện I / O đĩa theo mọi yêu cầu.


Vui lòng xem câu trả lời của tôi, câu trả lời của bạn giải thích hoàn hảo cách đăng ký công cụ mẫu nhưng có một cách dễ dàng hơn nhiều để chuyển các tệp html thuần túy.
laconbass

@ josh3736: Siêu liên kết "cực nhanh" của bạn hoạt động trong Firefox 41, nhưng không chạy được thử nghiệm trong Chromium Phiên bản 45.0.2454.101 Ubuntu 14.04 (64-bit). Tôi tự hỏi tại sao.
Lonnie Best


4

Để làm cho công cụ kết xuất chấp nhận html thay vì ngọc, bạn có thể làm theo các bước sau;

  1. Cài đặt củng cốuống một lân vào thư mục của bạn.

     npm install consolidate
     npm install swig
  2. thêm các dòng sau vào tệp app.js của bạn

    var cons = require('consolidate');
    
    // view engine setup
    app.engine('html', cons.swig)
    app.set('views', path.join(__dirname, 'views'));
    app.set('view engine', html');
  3. thêm các mẫu chế độ xem của bạn dưới dạng .html bên trong thư mục “chế độ xem”. Khởi động lại máy chủ nút của bạn và khởi động ứng dụng trong trình duyệt.

Mặc dù điều này sẽ hiển thị html mà không có bất kỳ vấn đề nào, tôi khuyên bạn nên sử dụng JADE bằng cách học nó. Jade là một công cụ tạo mẫu tuyệt vời và học được điều này sẽ giúp bạn đạt được thiết kế và khả năng mở rộng tốt hơn.


1
Vấn đề duy nhất thực sự lớn với Jade là vết lõm. Nếu bạn hiểu sai, mã sẽ không được biên dịch. Ngoài ra, tôi tự hỏi tại sao Jade khác so với thực tế rằng điều duy nhất nó làm là thu nhỏ mã ...
Zapper

4

trước tiên hãy kiểm tra phiên bản tương thích của công cụ mẫu bằng cách sử dụng dòng dưới đây

express -h

thì bạn phải sử dụng không có chế độ xem nào từ danh sách. chọn không có chế độ xem

express --no-view myapp

bây giờ bạn có thể sử dụng tất cả html, css, js và hình ảnh của bạn trong thư mục chung.


3

Có vẻ như bạn muốn cung cấp các tệp tĩnh. Và có một trang cho http://expressjs.com/en/starter/static-files.html

Kỳ lạ là không ai liên kết đến tài liệu.


"Kỳ lạ là không ai liên kết đến tài liệu" Tôi đồng ý rằng việc sử dụng một ngôn ngữ xem khác trong Express là một vấn đề nhỏ.
pixel 67

1

Xem xét bạn đã xác định các tuyến đường của mình hoặc biết cách thực hiện.

app.get('*', function(req, res){
    res.sendfile('path/to/your/html/file.html');
});

LƯU Ý: tuyến này phải được đặt sau tất cả các tuyến khác vì * chấp nhận mọi thứ.


1

vì Jade hỗ trợ HTML, nếu bạn chỉ muốn có đuôi .html, bạn có thể làm điều này

// app.js
app.engine('html', require('jade').renderFile);
app.set('view engine', 'html');

thì bạn chỉ cần thay đổi tệp trong các chế độ xem từ jade sang html.


Bạn không phải đặt 'dấu chấm' hoặc dấu chấm trước khi đánh dấu html?
Gus Crawford


-10

Nếu bạn muốn sử dụng html thuần túy trong nodeJS mà không cần sử dụng jade .. hoặc bất cứ thứ gì:

var html = '<div>'
    + 'hello'
  + '</div>';

Personnaly tôi đang làm tốt với điều đó.

Ưu điểm là đơn giản khi điều khiển. Bạn có thể sử dụng một số thủ thuật, như '<p>' + (name || '') + '</p>', ternary .. vv

Nếu bạn muốn có mã thụt lề trong trình duyệt, bạn có thể thực hiện:

+ 'ok \
  my friend \
  sldkfjlsdkjf';

và sử dụng \ t hoặc \ n tùy ý. Nhưng tôi thích mà không có, cộng với nó là nhanh hơn.


Tôi muốn để có thể sử dụng file HTML trong Express (vs Node.js đồng bằng)
Sanchit Gupta

ooooohh xin lỗi (tôi là người Pháp: p), vì vậy bạn có thể sử dụng fsmô-đun. fs.readFile(htmlfile, 'utf8', function (err, file) {
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.