Jade 대신 Express에서 HTML 사용


103

Node.JS와 함께 Express를 사용하는 동안 Jade를 제거하는 방법은 무엇입니까? 평범한 HTML을 사용하고 싶습니다. 다른 기사에서는 사람들이 현재 최신 버전에서 사용되지 않는 app.register ()를 권장하는 것을 보았습니다.

답변:


78

다음과 같이 할 수 있습니다.

  1. ejs 설치 :

    npm install ejs
  2. app.js의 템플릿 엔진을 ejs로 설정

    // app.js
    app.engine('html', require('ejs').renderFile);
    app.set('view engine', 'html');
  3. 이제 경로 파일에서 템플릿 변수를 할당 할 수 있습니다.

    // ./routes/index.js
    exports.index = function(req, res){
    res.render('index', { title: 'ejs' });};
  4. 그런 다음 / views 디렉토리에 html보기를 만들 수 있습니다.


2
방금 node.js를 사용하기 시작했습니다. 해결책은 명확하지 않습니다. 작은 html 웹 사이트가 있습니다. nodemailer를 사용하여 내 사이트를 통해 이메일을 보내려면 node.js가 필요합니다. 필요한 모든 것을 설치했습니다. 그러나 명시하여 내 웹 사이트의 실행을 만들기 위해 app.js 파일에 가야한다 어떤 생각을 가지고
user2457956

4
titlehtml 파일 에서 변수를 인쇄하는 방법은 무엇입니까?
Master Yoda

3
@MasterYoda가 요청한 것처럼 변수를 인쇄하는 방법을 궁금해하는 사람이 있다면 다음과 같이 html에 인쇄 할 수 있습니다. <% = title %>
Lucas Meine

62

Jade는 html 입력도 허용합니다.
순수한 HTML 제출을 시작하려면 줄 끝에 점을 추가하십시오.
그것이 당신을 위해 속임수를 쓰면 다음을 시도하십시오.

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

추신-HTML을 닫을 필요가 없습니다.이 작업은 Jade가 자동으로 수행합니다.


7
Doctype 5는 이제 더 이상 사용되지 않습니다. 첫 번째 행으로 "doctype html"을 사용하십시오.
snorkelzebra


18

Express 3부터는 간단히 사용할 수 있습니다. response.sendFile

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

에서 공식 특급 API 참조 :

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

주어진 경로에서 파일을 전송하십시오.

파일 이름 확장자에 따라 Content-Type 응답 헤더 필드의 기본값을 자동으로 설정합니다. 콜백 fn(err)은 전송이 완료되거나 오류가 발생할 때 호출됩니다.

경고

res.sendFilehttp 캐시 헤더를 통해 클라이언트 측 캐시를 제공하지만 서버 측에서 파일 내용을 캐시하지 않습니다. 위의 코드는 각 요청에서 디스크에 도달합니다 .


2
나는 OP가 여전히 정규 HTML 구문으로 일종의 템플릿을 사용하기를 원한다고 생각합니다. sendfile파일에서 바이트를 보내기 때문에 템플릿 작업을 할 수 없습니다. 또한 sendfile요청이 들어올 때마다 디스크에 부딪 히게되므로 큰 병목 현상이 발생하므로 이와 같이 사용하지 않는 것이 좋습니다 . 트래픽이 많은 페이지의 경우 실제로 인 메모리 캐싱을 수행해야합니다.
josh3736

1
@ josh3736 OP 의도에 대해 옳다면 질문을 개선해야합니다. 각 요청에 대해 디스크를 누르는 것이 맞습니다.이 사실에 대해 경고하기 위해 답변을 개선하겠습니다. 다음 사항에 대해 경고하기 위해 개선을 고려하십시오. 사용자 정의 엔진을 구현하는 경우 캐칭 기능도 구현해야합니다 (원하는 경우). Express에서 처리하지 않습니다.
laconbass

17

제 생각에는 html 파일을 읽기 위해 ejs와 같은 큰 것을 사용하는 것은 약간 무겁습니다. 매우 간단한 html 파일 용 템플릿 엔진을 방금 작성했습니다. 파일은 다음과 같습니다.

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

나는 내 htmlEngine을 불렀고 그것을 사용하는 방법은 간단히 말하면 다음과 같습니다

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

11

app.register()감가 상각되지 않았 app.engine()으며 Express 3 가 템플릿 엔진 처리 방식을 변경 한 이후 로 이름이 변경되었습니다 .

Express 2.x 템플릿 엔진 호환성에는 다음 모듈 내보내기가 필요합니다.

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

Express 3.x 템플릿 엔진은 다음을 내 보내야합니다.

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

템플릿 엔진이이 메서드를 노출하지 않는 경우 운이 좋지 않습니다.이 app.engine()메서드를 사용하면 모든 기능을 확장에 매핑 할 수 있습니다. 마크 다운 라이브러리가 있고 .md 파일을 렌더링하려고했지만이 라이브러리가 Express를 지원하지 않았다고 가정하면 app.engine()호출은 다음과 같을 수 있습니다.

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

'일반'HTML을 사용할 수있는 템플릿 엔진을 찾고 있다면 매우 빠르기 때문에 doT를 권장 합니다.

물론 Express 3 뷰 모델은 뷰 캐싱을 사용자 (또는 템플릿 엔진)에게 맡깁니다. 프로덕션 환경에서는 모든 요청에 ​​대해 디스크 I / O를 수행하지 않도록 뷰를 메모리에 캐시 할 수 있습니다.


내 대답을 살펴보십시오. 템플릿 엔진을 등록하는 방법을 완벽하게 설명하지만 일반 html 파일을 전송하는 훨씬 쉬운 방법이 있습니다.
laconbass

@ josh3736 : "매우 빠른"하이퍼 링크는 Firefox 41에서 작동하지만 Chromium 버전 45.0.2454.101 Ubuntu 14.04 (64 비트)에서 테스트를 실행하지 못합니다. 이유가 궁금합니다.
Lonnie Best


4

렌더 엔진이 jade 대신 html을 받아들이도록하려면 다음 단계를 따르십시오.

  1. 통합swig 를 디렉토리에 설치 하십시오.

     npm install consolidate
     npm install swig
  2. app.js 파일에 다음 줄을 추가하십시오.

    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. 보기 템플릿을 "views"폴더 안에 .html로 추가합니다. 노드 서버를 다시 시작하고 브라우저에서 앱을 시작하십시오.

이것은 아무런 문제없이 html을 렌더링하지만 JADE를 배우면서 사용하는 것이 좋습니다. Jade는 놀라운 템플릿 엔진이며이를 배우면 더 나은 디자인 및 확장 성을 달성하는 데 도움이됩니다.


1
Jade의 유일한 큰 문제는 들여 쓰기입니다. 틀리면 코드가 컴파일되지 않습니다. 또한, 내가 궁금해 왜 않는 유일한 코드를 축소 사실이 아닌 옥 ...
신랄한 비평

4

먼저 아래 줄을 사용하여 템플릿 엔진의 호환성 버전을 확인하십시오.

express -h

그런 다음 목록에서보기를 사용하지 않아야합니다.보기 없음을 선택하십시오.

express --no-view myapp

이제 공용 폴더에있는 모든 html, css, js 및 이미지를 사용할 수 있습니다.


3

음, 정적 파일을 제공하려는 것 같습니다. 그리고 http://expressjs.com/en/starter/static-files.html에 대한 페이지가 있습니다 .

아무도 문서에 연결하지 않는다는 것이 이상합니다.


"아무도 문서에 링크하지 않는다는 사실이 이상합니다."Express에서 다른 뷰 언어를 사용하는 것이 사소한 문제라는 데 동의합니다.
pixel 67

1

경로가 이미 정의되어 있거나 수행 방법을 알고 있다고 생각합니다.

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

참고 : *는 모든 것을 허용하므로이 경로는 다른 모든 경로 뒤에 배치해야합니다.


1

Jade는 HTML을 지원하기 때문에 .html ext를 갖고 싶다면 이렇게 할 수 있습니다.

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

그런 다음보기의 파일을 jade에서 html로 변경합니다.


HTML 마크 업 앞에 '점'이나 마침표를 넣을 필요가 없습니까?
Gus Crawford


-10

jade ..를 사용하지 않고 nodeJS에서 일반 html 을 사용하려면 다음을 수행하십시오.

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

개인적으로 나는 잘하고 있습니다.

장점은 제어가 간단하다는 것입니다. 다음과 같은 몇 가지 트릭을 사용할 수 있습니다.'<p>' + (name || '') + '</p>', ternary .. 등과 .

브라우저에서 들여 쓰기 된 코드를 원하는 경우 다음을 수행 할 수 있습니다.

+ 'ok \
  my friend \
  sldkfjlsdkjf';

\ t 또는 \ n을 마음대로 사용하십시오. 그러나 나는없이 선호하고 더 빠릅니다.


나는 (일반 Node.js를 대) Express에서 HTML 파일을 사용할 수 있도록하고 싶습니다
Sanchit 굽타

ooooohh 죄송합니다 (저는 프랑스어입니다 : p), fs모듈을 사용할 수 있습니다 . fs.readFile(htmlfile, 'utf8', function (err, file) {
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.