首页
学习
活动
专区
圈层
工具
发布
50 篇文章
1
【架构师(第一篇)】整体需求分析和架构设计
2
【架构师(第二篇)】脚手架架构设计和框架搭建
3
【架构师(第三篇)】脚手架开发之掌握Lerna操作流程
4
【架构师(第四篇)】脚手架开发之Lerna源码分析
5
【架构师(第五篇)】脚手架之import-local执行流程及简历设计
6
【架构师(第六篇)】脚手架之需求分析和架构设计
7
【架构师(第七篇)】脚手架之准备阶段编写
8
【架构师(第八篇)】脚手架之 commander 框架使用方法
9
【架构师(第九篇)】如何让 Node 环境支持 ES Module
10
【架构师(第十篇)】脚手架之注册命令及架构优化
11
【架构师(第十一篇)】脚手架之命令注册和执行过程开发
12
【架构师(第十二篇)】脚手架之命令行交互工具 inquirer.js 使用方法
13
【架构师(第十三篇)】脚手架之创建项目准备阶段开发
14
【架构师(第十四篇)】脚手架之 egg.js 和 mongodb 的使用
15
【架构师(第十五篇)】脚手架之创建项目模板开发
16
【架构师(第十六篇)】脚手架之创建项目模板的下载与更新
17
【架构师(第十七篇)】脚手架之 ejs 和 glob 的使用
18
【架构师(第十八篇)】脚手架之项目模板的安装
19
【架构师(第十九篇)】脚手架之组件库模板开发
20
【架构师(第二十篇)】脚手架之自定义模板及第一阶段总结
21
【架构师(第二十一篇)】编辑器开发之需求分析和架构设计
22
【架构师(第二十二篇)】编辑器开发之项目整体搭建
23
【架构师(第二十三篇)】编辑器开发之画布区域组件的渲染
24
【架构师(第二十四篇)】编辑器开发之添加模版到画布
25
【架构师(第二十五篇)】编辑器开发之属性编辑区域表单渲染
26
【架构师(第二十六篇)】编辑器开发之属性编辑同步渲染
27
【架构师(第二十七篇)】前端单元测试框架 Jest 基础知识入门
28
【架构师(第二十八篇)】 测试工具 Vue-Test-Utils 基础语法
29
【架构师(第二十九篇)】Vue-Test-Utils 触发事件和异步请求
30
【架构师(第三十篇)】Vue-Test-Utils 全局组件和第三方库 vuex | vue-router
31
【架构师(第三十一篇)】前端测试之 TDD 的开发方式
32
【架构师(第三十二篇)】 通用上传组件开发及测试用例
33
【架构师(第三十三篇)】 Vue 中的实例及本地图片预览
34
【架构师(第三十四篇)】 业务组件库开发之 vue3 的插件系统
35
【架构师(第三十五篇)】 业务组件库开发之使用 Rollup 进行打包
36
【架构师(第三十六篇)】 业务组件库开发之发布到 NPM
37
【架构师(第三十七篇)】 服务端开发之后端框架与数据库技术选型
38
【架构师(第三十八篇)】 服务端开发之本地安装最新版 MySQL 数据库
39
【架构师(第三十九篇)】 服务端开发之连接 MySQL 数据库
40
【架构师(第四十篇)】 服务端开发之连接 Mongodb 数据库
41
【架构师(第四十一篇)】 服务端开发之安装并连接 Redis数据库
42
【架构师(第四十二篇)】 服务端开发之常用的登录鉴权方式
43
【架构师(第四十三篇)】 服务端开发之单元测试和接口测试
44
【架构师(第四十四篇)】 服务端开发之 pm2 和 nginx 介绍
45
【架构师(第四十五篇)】 服务端开发之认识 Github actions
46
【架构师(第四十六篇)】 服务端开发之安装 Docker
47
【架构师(第四十七篇)】 服务端开发之认识 Docker
48
【架构师(第四十八篇)】 服务端开发之 Dockerfile
49
【架构师(第四十九篇)】 服务端开发之认识 Docker-compose
50
【架构师(第五十篇)】 服务端开发之自动发布到测试机
清单首页架构文章详情

【架构师(第十七篇)】脚手架之 ejs 和 glob 的使用


脚手架项目和组件初始化开发

将收获什么

  • ejs 模板渲染
  • glob 文件筛选
  • 项目标准安装和自定义安装
  • 组件库初始化和安装

主要内容

  • 脚手架安装模板功能架构设计
  • 脚手架模板安装核心实现
  • ejs 库功能详解
  • 脚手架安装模板功能开发
  • 组件模板开发及脚手架组件初始化功能支持
  • 脚手架自定义初始化项目模板功能开发

模板功能架构设计

之前已经发过这个流程图,下面来回顾一下,特别需要注意的是项目和组件的流程有一些区别。

准备阶段

下载模板阶段

安装模板阶段

ejs 的三种用法

安装 ejs

代码语言:javascript
复制
npm i -S ejs

编写一些基础代码

代码语言:javascript
复制
const ejs = require('ejs')
const path = require('path')

// 定义模板字符串
const html = '<div><%= user.name %></div>'

// 配置对象
const options = {}

// 数据
const data = {
  user: {
    name: '一尾流莺'
  }
}
const data2 = {
  user: {
    name: 'yiweiliuying'
  }
}

再准备一个 template.html 文件,内容如下

代码语言:javascript
复制
<div><%= user.name %></div>

第一种用法

用于多次调用同一个 compile function ,传入不同数据。使用 ejs.compile 生成 compile function是比较消耗性能的,所以需要多次调用的时候,生成一个就行了。

代码语言:javascript
复制
// 返回一个 compile  function , 用来解析 html 中的 ejs 模板
const template = ejs.compile(html, options)

// 得到一个编译后的模板
const compiledTemplate = template(data)
const compiledTemplate2 = template(data2)

console.log('🚀🚀 ~ compiledTemplate', compiledTemplate);
console.log('🚀🚀 ~ compiledTemplate2', compiledTemplate2);

可以看到模板字符串已经被替换成数据了。

第二种用法

用于只渲染一次模板的时候

代码语言:javascript
复制
const renderedTemplate = ejs.render(html, data, options)
console.log('🚀🚀 ~ renderedTemplate', renderedTemplate);

结果是一样的。

第三种用法

第三种用法是对文件进行编译。

编译文件有两种方式。

第一种,只传入三个参数,会返回一个 Promise

代码语言:javascript
复制
const renderedFile = ejs.renderFile(path.resolve(__dirname, 'template.html'), data, options)
console.log('🚀🚀 ~ renderedFile', renderedFile);

可以看到是一个 Promise 对象。

第二种,可以传入第四个参数,回调函数。

代码语言:javascript
复制
ejs.renderFile(path.resolve(__dirname, 'template.html'), data, options, (err, file) => {
  console.log('🚀🚀 ~ file', file);
})

ejs 标签的含义

写毕设的时候用的是 art-template 这一个模板引擎,但是忘的差不多了,应该跟 ejs 语法差不多。

  • <%: script 标签,用于流程控制,不会输出在页面上
  • <%_: 删除其前面的空格符
  • <%=: 输出数据到模板(输出是转义 HTML 字符串)
  • <%-: 输出非转义的数据到模板
  • <%#: 注释标签,不执行,不输出内容
  • <%%: 输出字符串 <%
  • %>: 一般结束标签
  • -%>: 删除后序的换行符
  • -%>: 将结束后的空格符删除

条件判断

代码语言:javascript
复制
<% if (user) { %>
  <h2><%= user.name %></h2>
<% } %>

循环

代码语言:javascript
复制
<% for(var i =0;i<10;i++) {%>
    <div><%= user.name%></div>
<% } %>

包含

通过 include 指令将相对于模板路径中的模板片段包含进来。

代码语言:javascript
复制
<% for(var i =0;i<10;i++) {%>
    <div><%= user.name%></div>
<% } %>
<%- include('./footer.html', {user}); %>

自定义分隔符

代码语言:javascript
复制
let ejs = require('ejs');
let users = ['geddy', 'neil', 'alex'];

// 单个模板文件
ejs.render('<?= users.join(" | "); ?>', {users: users},
    {delimiter: '?'});
// => 'geddy | neil | alex'

// 全局
ejs.delimiter = '$';
ejs.render('<$= users.join(" | "); $>', {users: users});
// => 'geddy | neil | alex'

自定义文件加载器

默认的文件加载器是 fs.readFileSync,如果想要自定义它, 设置 ejs.fileLoader 即可。

代码语言:javascript
复制
let ejs = require('ejs');
let myFileLoader = function (filePath) {
  return 'myFileLoader: ' + fs.readFileSync(filePath);
};

ejs.fileLoader = myFileLoad;

使用此功能,可以在读取模板之前对其进行预处理。

布局

ejs 并未对块(blocks)提供专门的支持,但是可以通过包含页眉和页脚来实现布局,如下所示:

代码语言:javascript
复制
<%- include('header'); -%>
<h1>
  Title
</h1>
<p>
  My page
</p>
<%- include('footer'); -%>

glob 的使用

glob 是用来匹配文件路径的,匹配规则如下。

  • * 匹配任意 0多个 任意字符
  • ? 匹配任意 一个 字符
  • [...] 若字符在中括号中,则匹配。若以 ! 或 ^ 开头,若字符不在中括号中,则匹配
  • !(pattern|pattern|pattern) 不满足括号中的所有模式则匹配
  • ?(pattern|pattern|pattern) 满足 01 括号中的模式则匹配
  • +(pattern|pattern|pattern) 满足 1 或 更多括号中的模式则匹配
  • *(a|b|c) 满足 0 或 更多括号中的模式则匹配
  • @(pattern|pat*|pat?erN) 满足 1 个括号中的模式则匹配
  • ** 跨路径匹配任意字符

安装

代码语言:javascript
复制
npm i glob -S

匹配所有 js 文件,忽略 node_modules 下的所有文件以及 webpack.config.js

代码语言:javascript
复制
const glob = require('glob')

glob('**/*.js', {
  ignore: ['node_modules/**', 'webpack.config.js']
}, (err, file) => {
  console.log('🚀🚀 ~ err', err);
  console.log('🚀🚀 ~ file', file);
})

结果如下

下一篇
举报
领券