赞
踩
循环简单数组使用.
标识每一项数据
可以通过#temp
中temp的bool值来决定内部内容是否显示
===================================================================================
3.1 mustache库不能用简单的正则表达式思路是先
数据:
模拟实现:
字符串的replace方法,可以第一个参数接收一个正则,第二个参数接收一个函数,有四个参数。
第一个参数代表正则匹配的部分,第二个参数代表()
中捕获到的内容,第三个参数代表位置,第四个参数代表源字符串
模板字符串:
tokens是一个JS的嵌套数组,说白了,就是模板字符串的JS表示
它是"抽象语法树"、"虚拟节点"等等的开山鼻祖
模板字符串:
tokens:
tokens是将字符串转换成了JS的嵌套数组,如果是纯文本(包括HTML标签),会被标识为text
如果是带有双括号({{}}
)的参数,会被标识为name
mustache库底层重点要做两个事情:
将模板字符串编译为tokens形式
将tokens结合数据,解析为dom字符串
把256行这里
改为
===============================================================================
4.1 使用webpack和webpack-dev-server构建
mustache官方库使用rollup进行模块化打包,而我们使用webpack(webpack-dev-server)进行模块化打包,这是因为webpack(webpack-dev-server)能更方便的在浏览器中(而不是nodeJS环境中)实时调试程序,相比nodeJS控制台,浏览器控制台更好用,比如能够点击展开数组的每一项
生成库是UMD的,可以同时在nodeJS环境中使用,也可以在浏览器环境中使用。实现UMD不难,只需要一个**“通用头”**即可
4.2 注意webpack和webpack-dev-server的版本
webpack最新版是5,webpack-dev-server最新版是4,但是目前最新版兼容成都不好,建议使用如下版本:
“webpack”: “^4.44.2”,
“webpack-cli”: “^3.3.12”,
“webpack-dev-server”: “^3.11.0”
const path = require(‘path’);
module.exports = {
mode: ‘development’,
entry: ‘./index.js’,
output: {
filename: ‘bundle.js’
},
devServer: {
contentBase: path.join(__dirname, ‘www’),
compress: false,
port: 8080,
// 虚拟打包的路径,bundle.js文件没有真正的生成
publicPath: ‘/xuni/’
}
}
要能够发现源码中书写精彩的地方。
将独立的功能拆分为独立的js文件中完成,通常是一个独立的类,每个单独的功能必须能独立的"单元测试"。
应该围绕中心功能,先把主干完成,然后修剪枝叶。
功能并不需要一步到位,功能的拓展要一步步完成,有的非核心功能甚至不需要实现。
粗浅的完成简单的目标:
不带有#标记
#标记的tokens,需要递归处理它的下标为2的小数组
现在遇到一个问题,JS不认识点符号
===============================================================
项目目录
index.html
index.js
import parseTemplateToTokens from “./parseTemplateToTokens”;
import renderTemplate from “./renderTemplate”;
// 全局提供HK_TemplateEngine方法
window.HK_TemplateEngine = {
// 渲染方法
render(templateStr, data) {
// 调用parseTemplateToTokens方法,让模板字符串可以变成数组
let tokens = parseTemplateToTokens(templateStr);
// 调用renderTemplate函数,让tokens数组变为dom字符串
return renderTemplate(tokens, data);
}
}
lookup.js
/**
功能是可以在dataObj对象中,寻找用连续点符号的keyName属性
比如,dataObj是
{
a:{
b:{
c:100
}
}
}
那么lookup(dataObj, ‘a.b.c’)结果就是100
*/
export default function lookup(dataObj, keyName) {
// 看看keyName中有没有点符号
if (keyName.indexOf(‘.’) !== -1 && keyName !== ‘.’) {
// 如果有点符号,那么拆开
let keys = keyName.split(‘.’);
// 设置一个临时变量,这个临时变量用于周转,一层一层找下去
let temp = dataObj;
// 每找一层,就把它设置为新的临时变量
for (let i = 0; i < keys.length; i++)
temp = temp[keys[i]];
return temp;
}
// 如果没有点符号
return dataObj[keyName];
};
nextTokens.js
/**
折叠tokens,将#和/之间的tokens能够整合起来,作为它的下标3
@param tokens
*/
export default function nextTokens(tokens) {
// 结果数组
let nestedTokens = [];
// 栈结构,存放小tokens,栈顶(靠近端口的,最新进入的)的数组中当前操作的这个tokens小数组
let sections = [];
// 收集器,天生指向nestedTokens结果数组,引用类型值,所以指向的是同一个数组
// 收集器的指向会变化,当遇到#的时候,收集器会指向这个item的下标为2的新数组
let collector = nestedTokens;
tokens.forEach(token => {
switch (token[0]) {
case ‘#’:
// 收集器中放入token
collector.push(token);
// 入栈
sections.push(token);
// 更换收集器。给item添加下标为2的项,并让收集器指向它
collector = token[2] = [];
break;
case ‘/’:
// 出栈 pop()方法返回出栈结果
sections.pop();
// 改变收集器为栈结构队尾(队尾是栈顶)那项下标为2的数组
collector = sections.length > 0 ? sections[sections.length - 1][2] : nestedTokens;
break;
default:
collector.push(token);
}
})
return nestedTokens;
};
parseArray.js
import lookup from “./loopup”;
import renderTemplate from “./renderTemplate”;
/**
处理数组,结合renderTemplate实现递归
注意:这个函数接收的参数是token,而不是tokens
token是什么,就是一个简单的[“#”, ‘students’, []]
这个函数要递归调用renderTemplate函数
调用次数由data决定
*/
export default function parseArray(token, data) {
// 得到整体数据data中这个数组要使用的部分
let v = lookup(data, token[1]);
// 结果字符串
let resultStr = ‘’;
// 遍历v数组
// 遍历v数组,v一定是数组
// 注意,下面这个循环可能是整个包中最难思考的一个循环
// 它是遍历数据,而不是遍历tokens。数组中的数据有几条,就要遍历几条。
for (let i = 0; i < v.length; i++) {
// 这里要补一个“.”属性
// 拼接
resultStr += renderTemplate(token[2], {
…v[i],
‘.’: v[i]
});
}
return resultStr;
}
parseTemplateToTokens.js
import Scanner from ‘./Scanner.js’;
import nextTokens from “./nextTokens”;
/*
将模板字符串变为tokens数组
*/
export default function parseTemplateToTokens(templateStr) {
let tokens = [];
// 创建扫描器
let scanner = new Scanner(templateStr);
let words;
// 让扫描器工作
while (!scanner.eos()) {
// 收集开始标记出现之前的文字
words = scanner.scanUtil(‘{{’);
if (words !== ‘’) {
// 尝试写一下去掉空格,智能判断是普通文字的空格,还是标签中的空格
// 标签中的空格不能去掉,比如
let isInJJH = false;
// 空白字符串
let _words = ‘’;
for (let i = 0; i < words.length; i++) {
// 判断是否在标签里
if (words[i] === ‘<’) {
isInJJH = true;
} else if (words[i] === ‘>’) {
isInJJH = false;
}
// 如果这项不是空格,拼接上
if (!/\s/.test(words[i])) {
_words += words[i];
} else {
// 如果这项是空格,只有当它在标签内的时候,才拼接上
if (isInJJH) {
_words += ’ ';
}
}
}
// 存起来,去掉空格
tokens.push([‘text’, _words]);
}
// 过双大括号
scanner.scan(‘{{’);
// 收集开始标记出现之前的文字
words = scanner.scanUtil(‘}}’);
if (words !== ‘’) {
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)
技术是没有终点的,也是学不完的,最重要的是活着、不秃。零基础入门的时候看书还是看视频,我觉得成年人,何必做选择题呢,两个都要。喜欢看书就看书,喜欢看视频就看视频。最重要的是在自学的过程中,一定不要眼高手低,要实战,把学到的技术投入到项目当中,解决问题,之后进一步锤炼自己的技术。
技术学到手后,就要开始准备面试了,找工作的时候一定要好好准备简历,毕竟简历是找工作的敲门砖,还有就是要多做面试题,复习巩固。有需要面试题资料的朋友点击这里可以领取。
{
isInJJH = false;
}
// 如果这项不是空格,拼接上
if (!/\s/.test(words[i])) {
_words += words[i];
} else {
// 如果这项是空格,只有当它在标签内的时候,才拼接上
if (isInJJH) {
_words += ’ ';
}
}
}
// 存起来,去掉空格
tokens.push([‘text’, _words]);
}
// 过双大括号
scanner.scan(‘{{’);
// 收集开始标记出现之前的文字
words = scanner.scanUtil(‘}}’);
if (words !== ‘’) {
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-5DNqU2gg-1712539911629)]
[外链图片转存中…(img-ZXfxUh49-1712539911629)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
[外链图片转存中…(img-Nmor1p5g-1712539911630)]
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)
技术是没有终点的,也是学不完的,最重要的是活着、不秃。零基础入门的时候看书还是看视频,我觉得成年人,何必做选择题呢,两个都要。喜欢看书就看书,喜欢看视频就看视频。最重要的是在自学的过程中,一定不要眼高手低,要实战,把学到的技术投入到项目当中,解决问题,之后进一步锤炼自己的技术。
技术学到手后,就要开始准备面试了,找工作的时候一定要好好准备简历,毕竟简历是找工作的敲门砖,还有就是要多做面试题,复习巩固。有需要面试题资料的朋友点击这里可以领取。
[外链图片转存中…(img-9u9HwifS-1712539911630)]
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。