node.js에서 EJS 템플릿 사용에 대한 튜토리얼

零下一度
풀어 주다: 2017-05-09 10:08:52
원래의
1061명이 탐색했습니다.

이 글은 주로 EJS 템플릿의 빠른 시작 학습을 소개합니다. 편집자가 꽤 좋다고 생각해서 지금 공유하고 참고용으로 제공하겠습니다. 에디터를 따라가서 살펴보겠습니다.

노드 선택할 수 있는 오픈소스 템플릿이 많지만, 저처럼 나이 많은 사람들은 EJS를 사용하는 것이 좋습니다. 🎜>ASP/PHP /JSP EJS 사용 경험은 실제로 매우 자연스럽습니다. 즉, JavaScript 코드를 <%...%> ; 가장 전통적인 방법인 <%=output 변수 %>를 사용합니다(또한 <%-output 변수는 &와 같은 기호를 이스케이프하지 않습니다). 설치 EJS 명령은 다음과 같습니다.

npm install ejs
로그인 후 복사
JS 호출

JS 호출에는 두 가지 주요 방법이 있습니다.

ejs.compile(str, options); 
// => Function 
 
ejs.render(str, options); 
// => str
로그인 후 복사

사실 , EJS는 무료일 수 있습니다. 예를 들어,

var ejs = require(&#39;&#39;), str = require(&#39;fs&#39;).readFileSync(dirname + &#39;/list.ejs&#39;, &#39;utf8&#39;); 
 
var ret = ejs.render(str, { 
 names: [&#39;foo&#39;, &#39;bar&#39;, &#39;baz&#39;] 
}); 
 
console.log(ret);
로그인 후 복사

ejs.render()를 참조하세요. 첫 번째 매개변수는 템플릿의

문자열

이고 템플릿은 다음과 같습니다.

<% if (names.length) { %> 
 <ul> 
  <% names.forEach(function(name){ %> 
   <li foo=&#39;<%= name + "&#39;" %>&#39;><%= name %></li> 
  <% }) %> 
 </ul> 
<% } %>
로그인 후 복사
names는 지역 변수가 됩니다.


옵션 매개변수

두 번째 매개변수는 데이터이며 일반적으로
객체

입니다. 그리고 이 개체는 옵션으로 간주할 수 있습니다. 즉, 데이터와 선택 항목이 모두 동일한 개체에 있음을 의미합니다.

매번 디스크를 저장하고 싶지 않다면

템플릿을 캐시하고 options.filename을 설정하면 됩니다. 예:

var ejs = require(&#39;../&#39;) 
 , fs = require(&#39;fs&#39;) 
 , path = dirname + &#39;/functions.ejs&#39; 
 , str = fs.readFileSync(path, &#39;utf8&#39;);  
var users = []; 
users.push({ name: &#39;Tobi&#39;, age: 2, species: &#39;ferret&#39; }) 
users.push({ name: &#39;Loki&#39;, age: 2, species: &#39;ferret&#39; }) 
users.push({ name: &#39;Jane&#39;, age: 6, species: &#39;ferret&#39; }) 
 
var ret = ejs.render(str, { 
 users: users, 
 filename: path 
}); 
 
console.log(ret);
로그인 후 복사
관련 옵션은 다음과 같습니다.

    cache
  1. 컴파일된 함수는 캐시되며 파일 이름이 필요합니다

    filename 캐시된 키 이름
  2. scope
  3. 함수 범위
  4. 실행

    디버그 출력 생성 함수 본문
  5. compileDebug false인 경우 디버그 계측이 컴파일되지 않습니다
  6. 클라이언트
  7. 반환
  8. 의 독립 실행형 컴파일 함수


  9. include 명령

게다가

<ul>
 <% users.forEach(function(user){ %>
  <% include user/show %>
 <% }) %>
</ul>
로그인 후 복사

와 같은 공개 템플릿을 삽입하려면 즉, 파일을 가져옵니다. , 파일 이름 옵션을 설정해야 합니다. 포함 기능을 활성화해야 합니다. 그렇지 않으면 포함이 디렉터리를 인식하지 못합니다.

템플릿:

<h1>Users</h1> 
 <% function user(user) { %> 
 <li><strong><%= user.name %></strong> is a <%= user.age %> year old <%= user.species %>.</li> 
<% } %> 
 
<ul> 
 <% users.map(user) %> 
</ul>
로그인 후 복사

EJS는 컴파일된 템플릿을 지원합니다. 템플릿 컴파일 후에는 IO 작업이 없으며 매우 빠르며 로컬 변수를 공유할 수 있습니다. 다음 예제 user/show는 ejs 확장을 무시합니다:

<ul> 
 <% users.forEach(function(user){ %> 
  <% include user/show %> 
 <% }) %> 
</ul>
로그인 후 복사

Customized CLOSE TOKEN


{{= title }을 사용하려는 경우 }< ;/h1>은 일반적으로 <%%> 표시가 아니며 사용자 정의할 수도 있습니다.
 var ejs = require(&#39;ejs&#39;); 
ejs.open = &#39;{{&#39;; 
ejs.close = &#39;}}&#39;;
로그인 후 복사

포맷된 출력

도 가능합니다.

 ejs.filters.last = function(obj) { 
 return obj[obj.length - 1]; 
};
로그인 후 복사
Call
<p><%=: users | last %></p>
로그인 후 복사

EJS는 브라우저 환경도 지원합니다.

<html> 
 <head> 
  <script src="../ejs.js"></script> 
  <script id="users" type="text/template"> 
   <% if (names.length) { %> 
    <ul> 
     <% names.forEach(function(name){ %> 
      <li><%= name %></li> 
     <% }) %> 
    </ul> 
   <% } %> 
  </script> 
  <script> 
   onload = function(){ 
    var users = document.getElementById(&#39;users&#39;).innerHTML; 
    var names = [&#39;loki&#39;, &#39;tobi&#39;, &#39;jane&#39;]; 
    var html = ejs.render(users, { names: names }); 
    document.body.innerHTML = html; 
   } 
  </script> 
 </head> 
 <body> 
 </body> 
</html>
로그인 후 복사

EJS가

JSON

객체의 여러 레이어를 출력할 수 있는지 궁금합니다.

그런데 일부 네티즌들은 jQ 마스터 John이 몇 년 전에 20줄짜리 템플릿을 작성했다는 소식을 전했는데, EJS와 비슷하지만 짧고 간결합니다!


간단하고 실용적인 js

템플릿 엔진

50줄 미만의 js 템플릿 엔진, 다양한 js 구문 지원:

<script id="test_list" type="text/html"> 
<%= 
  for(var i = 0, l = p.list.length; i < l; i++){ 
    var stu = p.list[i]; 
=%> 
  <tr> 
    <td<%=if(i==0){=%> class="first"<%=}=%>><%==stu.name=%></td> 
    <td><%==stu.age=%></td> 
    <td><%==(stu.address || &#39;&#39;)=%></td> 
  <tr> 
  
<%= 
  } 
=%> 
</script>
로그인 후 복사

"<%= xxx =%>"에는 js 논리 코드가 포함되어 있으며, "<%== xxx =%>"에는 PHP의

echo <🎜와 유사한 직접 출력용 변수가 포함되어 있습니다. > 기능. "p"는 아래 빌드 메소드 호출 시 k-v 객체 매개변수입니다. "

new

JTemp" 호출:

<🎜 호출 시 다른 매개변수 이름으로 설정할 수도 있습니다. > 위의 temp가 생성된 후 build 메소드를 여러 번 호출하여 html을 생성할 수 있습니다. 다음은 템플릿 엔진의 코드입니다.
var JTemp = function(){ 
  function Temp(htmlId, p){ 
    p = p || {};//配置信息,大部分情况可以缺省 
    this.htmlId = htmlId; 
    this.fun; 
    this.oName = p.oName || &#39;p&#39;; 
    this.TEMP_S = p.tempS || &#39;<%=&#39;; 
    this.TEMP_E = p.tempE || &#39;=%>&#39;; 
    this.getFun(); 
  } 
  Temp.prototype = { 
    getFun : function(){ 
      var _ = this, 
        str = $(&#39;#&#39; + _.htmlId).html(); 
      if(!str) _.err(&#39;error: no temp!!&#39;); 
      var str_ = &#39;var &#39; + _.oName + &#39;=this,f=\&#39;\&#39;;&#39;, 
        s = str.indexOf(_.TEMP_S), 
        e = -1, 
        p, 
        sl = _.TEMP_S.length, 
        el = _.TEMP_E.length; 
      for(;s >= 0;){ 
        e = str.indexOf(_.TEMP_E); 
        if(e < s) alert(&#39;:( ERROR!!&#39;); 
        str_ += &#39;f+=\&#39;&#39; + str.substring(0, s) + &#39;\&#39;;&#39;; 
        p = _.trim(str.substring(s+sl, e)); 
        if(p.indexOf(&#39;=&#39;) !== 0){//js语句 
          str_ += p; 
        }else{//普通语句 
          str_ += &#39;f+=&#39; + p.substring(1) + &#39;;&#39;; 
        } 
        str = str.substring(e + el); 
        s = str.indexOf(_.TEMP_S); 
      } 
      str_ += &#39;f+=\&#39;&#39; + str + &#39;\&#39;;&#39;; 
      str_ = str_.replace(/\n/g, &#39;&#39;);//处理换行 
      var fs = str_ + &#39;return f;&#39;; 
      this.fun = Function(fs); 
    }, 
    build : function(p){ 
      return this.fun.call(p); 
    }, 
    err : function(s){ 
      alert(s); 
    }, 
    trim : function(s){ 
      return s.trim?s.trim():s.replace(/(^\s*)|(\s*$)/g,""); 
    } 
  }; 
  return Temp; 
}();
로그인 후 복사

핵심은 템플릿 코드를 문자열을 이어주는 함수로 변환하고, 데이터를 얻을 때마다 이 함수를 호출하는 것입니다.

주로 휴대폰(웹킷)에 사용되기 때문에 스트링 스플라이싱의 효율성은 고려하지 않습니다. IE에서 사용해야 한다면 스트링 스플라이싱 방식을

Array로 변경하는 것이 가장 좋습니다.

. 푸시() 형식입니다.

첨부파일: connect + ejs 예시.

var Step = require(&#39;../../libs/step&#39;), 
  _c = require(&#39;./utils/utils&#39;), 
  fs = require(&#39;fs&#39;), 
  ejs = require(&#39;ejs&#39;), 
  connect = require(&#39;connect&#39;); 
 
exports.loadSite = function(request, response){ 
  var siteRoot = &#39;C:/代码存档/sites/a.com.cn&#39;; 
  // _c.log(request.headers.host); 
   
  var url = request.url; 
  // 如果有 html 的则是动态网页,否则为静态内容 
  if(url == &#39;/&#39; || ~url.indexOf(&#39;/?&#39;) || url.indexOf(&#39;.asp&#39;) != -1 || url[url.length - 1] == &#39;/&#39;){ 
    var tplPath; 
     
    if(url == &#39;/&#39; || ~url.indexOf(&#39;/?&#39;) || url[url.length - 1] == &#39;/&#39;){ 
      // 默认 index.html 
      tplPath = siteRoot + request.url + &#39;default.asp&#39;; 
    }else{ 
      tplPath = siteRoot + request.url.replace(/\?.*$/i,&#39;&#39;); // 只需要文件名 
    } 
 
    // 从文件加载模板 
    Step(function(){ 
      _c.log(&#39;加载模板:&#39; + tplPath); 
      fs.exists(tplPath, this); 
    }, function(path_exists){ 
      if(path_exists === true)fs.readFile(tplPath, "utf8", this); 
      else if(path_exists === false) response.end404(request.url); 
      else response.end500(&#39;文件系统异常&#39;, &#39;&#39;); 
    },function(err, tpl){ 
 
      var bigfootUrl, cssUrl, projectState = 0; // 0 = localhot/ 1 = Test Server / 2 = Deployed 
      switch(projectState){ 
        case 0: 
           bigfootUrl = "http://127.0.0.1/bigfoot/"; 
           cssUrl   = "http://127.0.0.1/lessService/?isdebug=true"; 
        break;  
        case 1: 
           bigfootUrl = "http://112.124.13.85:8080/static/"; 
           cssUrl   = "/asset/style/"; 
        break;  
        case 2: 
           bigfootUrl = "http://localhost:8080/bigfoot/"; 
        break; 
      } 
 
      var sitePath = request.getLevelByUrl(require(siteRoot + &#39;/public/struct&#39;)), 
        first = sitePath[0]; 
      var htmlResult = ejs.render(tpl, { 
        filename : tplPath, 
        bigfootUrl: bigfootUrl, 
        cssUrl : cssUrl, 
        projectState: projectState, 
        query_request: request.toJSON(), 
        request: request, 
        config: require(siteRoot + &#39;/public/config&#39;), 
        struct: require(siteRoot + &#39;/public/struct&#39;), 
        sitePath : sitePath, 
        firstLevel : first 
      }); 
      // _c.log(first.children.length) 
      response.end200(htmlResult); 
    }); 
     
  }else{ 
    connect.static(siteRoot)(request, response, function(){ 
      // if not found... 
      response.writeHead(404, {&#39;Content-Type&#39;: &#39;text/html&#39;}); 
      response.end(&#39;404&#39;);   
    }); 
  } 
}
[관련 추천]

1.

무료 js 온라인 동영상 튜토리얼

2.

JavaScript 중국어 참조 매뉴얼

3.

php.cn Dugu Jiujian (3) - JavaScript 비디오 튜토리얼

위 내용은 node.js에서 EJS 템플릿 사용에 대한 튜토리얼의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿