Jade yerine Express'te HTML kullanma


103

Express'i Node.JS ile kullanırken Jade'den nasıl kurtulurum? Ben sadece düz html kullanmak istiyorum. Diğer makalelerde, insanların artık en son sürümde kullanımdan kaldırılan app.register () uygulamasını önerdiklerini gördüm.

Yanıtlar:


78

Bunu şu şekilde yapabilirsiniz:

  1. Ejs yükleyin:

    npm install ejs
  2. Şablon motorunuzu app.js'de ejs olarak ayarlayın

    // app.js
    app.engine('html', require('ejs').renderFile);
    app.set('view engine', 'html');
  3. Artık rota dosyanızda şablon değişkenleri atayabilirsiniz

    // ./routes/index.js
    exports.index = function(req, res){
    res.render('index', { title: 'ejs' });};
  4. Daha sonra / views dizininde html görünümünüzü oluşturabilirsiniz.


2
Node.js kullanmaya başladım. Çözüm benim için net değil. Küçük bir html web sitem var. Nodemailer kullanarak sitem üzerinden e-posta göndermek için node.js'ye ihtiyacım var. Gereken her şeyi kurdum. Ancak, web
sitemin

4
Değişken titlehtml dosyasında nasıl yazdırılır ?
Usta Yoda

3
Değişkenin nasıl yazdırılacağını merak eden biri varsa, @MasterYoda'nın sorduğu gibi, bunu html'de şu şekilde yazdırabilirsiniz: <% = title%>
Lucas Meine

62

Jade ayrıca html girdisini de kabul eder.
Saf html göndermeye başlamak için satırın sonuna bir nokta eklemeniz yeterlidir.
Bu sizin için hile yaparsa, deneyin:

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

Not - HTML'yi kapatmaya gerek yok - bu Jade tarafından otomatik olarak yapılır.


7
Doctype 5 artık kullanımdan kaldırılmıştır. İlk satır olarak "doctype html" kullanın.
snorkelzebra


18

Ekspres 3'ten itibaren kullanabilirsiniz response.sendFile

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

Gönderen resmi ekspres api referans :

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

Dosyayı verilen yoldan aktarın.

Dosya adının uzantısına göre Content-Type yanıt başlık alanını otomatik olarak varsayılan hale getirir. Geri arama fn(err), aktarım tamamlandığında veya bir hata oluştuğunda çağrılır.

Uyarı

res.sendFilehttp önbellek başlıkları aracılığıyla istemci tarafı önbellek sağlar, ancak sunucu tarafındaki dosya içeriklerini önbelleğe almaz. Yukarıdaki kod, her istekte diske vuracaktır .


2
OP'nin hala bir tür şablon kullanmak istediğine inanıyorum, sadece normal HTML sözdizimi ile. sendfilesadece bir dosyadan bayt gönderdiği için herhangi bir şablonlama yapmanıza izin vermez. Dahası, sendfilebu şekilde kullanmamanızı tavsiye ederim çünkü bu, her istek geldiğinde diske vuracağınız anlamına gelir - büyük bir darboğaz. Yüksek trafikli sayfalar için gerçekten bellek içi önbelleğe alma yapmalısınız.
josh3736

1
@ josh3736 OP niyeti konusunda haklıysanız, soru geliştirilmelidir. Her istekte diske vurma konusunda haklısın, bu gerçek hakkında uyarmak için cevabımı geliştireceğim. Lütfen aşağıdakiler hakkında uyarmak için kendi motorunuzu geliştirmeyi düşünün: özelleştirilmiş bir motor uygularsanız, yakalama özelliğini de uygulamalısınız (istenirse), bu ifade tarafından ele alınmaz.
laconbass

17

Bana göre, sadece html dosyalarını okumak için ejs kadar büyük bir şey kullanmak biraz zor. Html dosyaları için oldukça basit olan kendi şablon motorumu yazdım. Dosya şuna benzer:

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 = {};

Mine htmlEngine'i aradım ve onu kullanma şekliniz sadece şunu söylemektir:

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

11

app.register()amortismana tabi tutulmamıştır, app.engine()Express 3 şablon motorlarının işlenme şeklini değiştirdiğinden beri olarak yeniden adlandırılmıştır .

Express 2.x şablon motoru uyumluluğu, aşağıdaki modül dışa aktarımını gerektirdi:

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

Express 3.x şablon motorları aşağıdakileri dışa aktarmalıdır:

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

Bir şablon motoru bu yöntemi açığa çıkarmazsa, şansınız kalmaz, app.engine()yöntem herhangi bir işlevi bir uzantıya eşlemenize izin verir. Bir markdown kitaplığınız olduğunu ve .md dosyalarını işlemek istediğinizi, ancak bu kitaplık Express'i desteklemediğini varsayalım, app.engine()aramanız aşağıdaki gibi görünebilir:

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

'Düz' HTML kullanmanıza izin veren bir şablon oluşturma motoru arıyorsanız , son derece hızlı olduğu için doT'yi tavsiye ederim. .

Elbette, Express 3 görünüm modelinin görünümü önbelleğe almayı size (veya şablon oluşturma motorunuza) bıraktığını unutmayın. Bir üretim ortamında, muhtemelen her istek üzerine disk G / Ç yapmamak için görünümlerinizi bellekte önbelleğe almak istersiniz.


Lütfen cevabıma bir göz atın, sizinki şablon motorlarının nasıl kaydedileceğini mükemmel bir şekilde açıklıyor ancak düz html dosyalarını aktarmanın çok daha kolay bir yolu var.
laconbass

@ josh3736: "Son derece hızlı" bağlantınız Firefox 41'de çalışıyor, ancak Chromium Sürüm 45.0.2454.101 Ubuntu 14.04 (64-bit) 'de testleri çalıştıramıyor. Nedenini merak ediyorum.
Lonnie Best


4

Render motorunun jade yerine html'yi kabul etmesini sağlamak için aşağıdaki adımları takip edebilirsiniz;

  1. Konsolide et ve dizininize swig yükleyin .

     npm install consolidate
     npm install swig
  2. app.js dosyanıza aşağıdaki satırları ekleyin

    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. görünüm şablonlarınızı .html olarak "görünümler" klasörüne ekleyin. Düğüm sunucunuzu yeniden başlatın ve uygulamayı tarayıcıda başlatın.

Bu html'yi sorunsuz hale getirecek olsa da, JADE'i öğrenerek kullanmanızı tavsiye ederim. Jade harika bir şablon motorudur ve bunu öğrenmek, daha iyi tasarım ve ölçeklenebilirlik elde etmenize yardımcı olacaktır.


1
Jade ile ilgili gerçekten büyük tek sorun girintidir. Yanlış anlarsanız, kod derlenmez. Ayrıca, Jade'in yaptığı tek şeyin kodu küçültmek dışında neden olduğunu merak ediyorum ...
zapper

4

önce aşağıdaki satırı kullanarak şablon motorunun uyumluluk sürümünü kontrol edin

express -h

o zaman listeden hiçbir görünüm kullanmamalısınız. görünüm yok seç

express --no-view myapp

artık tüm html, css, js ve görsellerinizi ortak klasörde kullanabilirsiniz.



1

Rotalarınızı zaten tanımladığınızı veya nasıl yapılacağını bildiğinizi düşünürsek.

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

NOT: * her şeyi kabul ettiği için bu rota diğerlerinin hepsinden sonra yerleştirilmelidir.


1

Jade HTML'yi desteklediğinden, sadece .html uzantısına sahip olmak istiyorsanız, bunu yapabilirsiniz

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

o zaman sadece görünümlerdeki dosyayı jade'den html'ye değiştirirsiniz.


HTML işaretlemesinden önce bir nokta veya nokta koymanız gerekmiyor mu?
Gus Crawford


-10

Jade kullanmadan nodeJS'de düz html kullanmak istiyorsanız .. veya her neyse:

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

Şahsen ben bununla iyiyim.

Avantaj, kontrol sırasında basitliktir. '<p>' + (name || '') + '</p>'Üçlü .. vb. Gibi bazı numaralar kullanabilirsiniz .

Tarayıcıda girintili bir kod istiyorsanız şunları yapabilirsiniz:

+ 'ok \
  my friend \
  sldkfjlsdkjf';

ve istediğinizde \ t veya \ n kullanın. Ama olmadan tercih ederim, artı daha hızlı.


Express'te HTML dosyalarını kullanabilmek istiyorum (düz Node.JS'ye kıyasla)
Sanchit Gupta

ooooohh özür dilerim (ben fransızım: p), böylece fsmodülü kullanabilirsiniz . fs.readFile(htmlfile, 'utf8', function (err, file) {
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.