1. 关于前端与后端
前端重点关于界面开发和数据渲染相关的工作,所有的开发工作都是围绕界面进行的
后端关注数据处理和业务逻辑的工作,所有的开发工作都是围绕高效的梳理数据进行的
2.NodeJS概述与安装
Node.js是一个基于Chrome V8引擎的JavaScript运行环境
NodeJS特点
它是一个JavaScript运行环境,可以直接执行JS代码
依赖于Chrome V8引擎进行代码解释,执行性能非常高
事件驱动
非阻塞I/O
轻量,可伸缩,适于实时数据交互应用
单进程,单线程
NodeJS下载安装::https://nodejs.org/zh-cn/download/(安装指定版本)
安装成功后,打开命令行,输入node -v 若出现对应版本号,则说明安装成功
3.第一个node应用
在项目中创建一个node应用: app.js
console.log('hello node')
打开系统命令行,通过命令执行代码
node app.js
注: 通过命令执行代码时,注意命令的正确方式:node app.js
文件夹和文件名称,不要命名为node :在安装了NodeJS之后,命令行中js文件也会被当成当前文件夹能识别的命令,如果某个js文件名称为node.js,此时当前文件夹在命令行中打开,执行node命令时,这个命令不再是安装的NodeJs中的命令,而是文件node.js
4.文件操作
常见模块
作为一个成熟的后端应用开发语言,需要语言本身具备哪些功能
文件读写,文件内容的输入和输出,简称文件IO
网络访问,通过网络让数据按照指定的协议进行传输
模块化开发,后端应用处理的数据会比较复杂,处理过程中大量代码合理组织
异常处理
集合操偶做
文件操作入门
NodeJS中内建了很多模块,可以很方便的实现各种后端需要的功能,如文件操作模块
文件操作模块:fs,在应用中引入文件读写的支持,使用固定语法
const fs = require('fs')
打开一个系统中的文件,可以使用固定函数
const fd = fs.openSync('index.html','w')
打开的文件,可以针对文件中的数据进行读写操作,固定的操作函数
fs.writeSync(fd,'<h1>这是代码生成的文件</h1>')
操作完成后可以使用固定函数关闭文件
fs.closeSync(fd)
案例:自动创建需要的文件和文件中的代码
const fs = require('fs')
const fd = fs.openSync('index.html','w')
fs.writeSync(fd,"<h1>这是生成的h1</h1>")
fs.closeSync(fd)
console.log('代码执行完成')
案例:读取指定文件中的内容
const fs = require('fs')
const content = fs.readFileSync('index.html','utf-8')
console.log(content)
关于路径问题
NodeJS正在运行环境中,提供了两个变量__dirname、__filename,分别表示当前名零零执行的代码文件所在的目录和全路径,建议文件读写时配合这两个变量明确文件的绝对路径,不推荐直接使用相对路径
const fs = require('fs')
const content = fs.readFileSync(__dirname+'/index.html','utf-8')
console.log(content)
5.同步和异步
异步:多个任务从前到后依次执行,前一个任务没有执行完成时,后一个任务等待
优点:顺序可控
缺点:浪费时间资源
异步: 多个任务同时执行,互不影响,多个任务的执行过程没有严格的前后关系
优点:利用了所有资源,执行效率高
缺点:任务执行过程不可控,一个任务什么时候执行完成不知道
jQuery animate()典型的异步执行
案例操作:关于异步和同步执行过程
<script src='jquery.js'></script>
$('button').click(funciton(){
//异步执行
$('#box1').animate({left:1000},1000)
$('#box1').animate({top:300},1000)
//同步执行
$('#box3').animate({left:1000},1000,()=>{
$('#box4').animate({top:300},1000)
})
})
6.文件操作
同步文件操作
fs/openSync(path[,flags[,model]])
-path: 打开文件的路径,建议使用绝对路径(__dirname)
-flag: 打开文件的方式,默认r(read只读)
-mode:处理文件权限,默认666
fs.writeSync(fd.stirng[,position[,encoding]])
-fd:需要操作的,已经打开的文件
-string:需要给用户中写入的内容
-postion:写入内容的位置
-encoding:写入内容的编码
fs.readSync(fd,buffer[,options])
-fd:需要读取的内容,已经打开的文件
fs,renameSync(odlPath,newPath)
-oldPath:文件旧名称
-newPath:文件新名称
fs.closeSync(fd)
-fd:需要关闭的文件
异步文件操作
文件操作的异步函数名称,和同步函数名称相比较,少了一个Sync
//文件模块,异步操作
fs.readFile(__dirname+'/index.html','utf-8',(err,data)=>{
err ? console.lof(err+'异常信息') : console.log(data+'读取到的数据')
})
案例操作: 读取用户指定路径下的所有文件
移步: 读取用户指定定路径下的所有文件
7.模块化
所谓模块化,就是将复杂的项目拆分成东哥互相关联不大的、可以独立运行的、具备独立功能的小模块进行独立开发,最后将这些小模块使用固定的语法组合到一起形成大型项目的过程,模块化主要区分为两个步骤:拆分、组合
优点:降低了直接开发一个完整项目的技术难度,提高了拆分后每个模块的开发质量和效率
缺点:完整项目的拆分架构需要一定的技术门槛,整体项目的进度的控制提高了成本
软件开发基础理论
软件开发区分很多个方向,不同的方向开发思路都有一些固定的操作套路,软件开发过程中需要解决的问题都是如何通过代码模拟还原生活中的场景,解决对应生活场景中的一些业务问题,所以就出现了一些固定的编码步骤和处理思路
1.软件开发原则
六大开发原则,指导我们开发代码的操作思路
-开闭原则(OCP): Open Close Principle,可以新增代码,尽量不要修改已有代码
-里氏替换原则(LSP):Liskov Substitution Principle,主要用在继承关系中
-依赖倒置原则(DIP):Dependence Inversion Peinciple,主要用在面向接口
-合成复用原则(CRP):Composite Reuse Priciple,主要用在模块化开发
-迪米特法则(DP):/最少知道原则/单一职责原则(SRP):每个模块的功能尽量独立和单一
核心:按照最优雅的方式解决固定的问题
-如何在开发中降低出现问题的概率
-如何在开发中提高项目功能扩展性
-如何在开发中保障数据的安全
2.软件开发设计模式
发展到现在,软件开发行业中默认/固化23种设计模式,分别针对创建对象、对象行为操作、功能结构构建三个最大的应用场景尽心了区分
23种设计模式:指导我们解决固定问题时,如何编写高质量代码的方式
-创建型模式
简单工厂模式/工厂方法方式、抽象工厂模式、单例模式、建造模式、原型模式
-行为型模式
模板方法/命令模式/责任链模式/策略模式/中介者模式/观察者模式/备忘录模式/访问者模式/状态模式/解释型模式/迭代器模式
-机构型模式
代理模式/装饰着模式/适配器模式/桥接模式/组合模式/外观模式/享元模式
3.软件编程思想
结合了软甲那开发原则、软件开发模式实现的一套里理论性机制,用于解决不同规模的、不同应用场景的整体项目问题
软件编程思想实际应用种,区分理论你指导思想和架构实现模式
–理论指导思想
面向过程开发、面向对象开发、面向接口开发、面向服务开发、面向平台开发…
–架构实现模式
主要体现在一些工具框架的底层实现原理
-MVC思想、MVP思想、MVVM思想…
NodeJS模块化
NodJS是一个JavaScript运行时环境,支持JavaScript语言开发服务端应用,开发一些较为复杂的应用时,也有自己的开发规范,常见的JavaScript编码贵伐(通用规范)
ComminJS规范
CMD规范
AMD规范
当一个编程语言开发复杂的软件应用时,代码量就会非常庞大,开发的业务逻辑也会非常繁杂,良好的规范(编码规范、文件管理规范、项目开发规范)能指导开发人员进行有效的代码组织和管,方便开发效率的提升以及后期项目的维护,NodeJS中遵循的基本开发规范是常见的CommonJS规范,是CMD规范以及AMD规范的基础
CommonJS规范
该规范更加适合前端开发、是CMD规范以及AMD规范的基础
模块化拆分和组合
模块化拆分
本质:将复杂的代码,按照不同的功能性能,拆分到不同的多个文件中
特点:项目运行时,启动文件只有一个,一般会将拆分的多个模块直接或者间接的合并到这个启动文件中
模块化组合
在拆分的模块中,使用固定的语法,将需要共享的数据导出来
let name = 'zhangsan'
module.exports = {
//需要导出的数据
name
}
创建一个入口文件,命名为index.js,使用固定语法将拆分出去的模块,组合进来
const data = require('./module/data.js')
//使用其他模块中的数据
console.log(data.name)
案例:开发一个剔除字符串两侧空格的独立模块
NodeJS中,默认可以将一个.js文件,当成一个独立的模块使用
trim.js
function trim(str) {
let reg = /^\s+|\s+$/ig
return str.replace(reg,'')
}
trim.left = function(str) {
let reg = /^\s+/ig
return str.replace(reg,'')
}
trim.right = function(str) {
let reg = /\s+$/ig
return str.replace(reg,'')
}
index.js
const {trim} = require('./module/data')
let str = ' zhangsan '
console.log(str)
consoel.log(trim(str))
consoel.log(trim.left(str))
consoel.log(trim.right(str))
module对象
什么是module:
NodeJS为运行的.js文件,提供了一个默认对象,module对象,指代就是当前js文件
NodeJS本质上认为,一个.js文件就是一个独立的模块,使用module对象表示
module.exports 导出数据
NodeJS中如果需要导出的数据比较分散,可以使用exports直接进行数据的导出
module.exports 和exports
module.exports和exports都能导出数据,可以在适当的时候混合使用(不推荐)
8.第三方模块管理
所谓第三方模块,就是第三方企业、公司、团队或者个人开发的是西安了某些功能 js模块
一般会发布在网络上供其他项目使用
公共社区: https://npmjs.org
根据名称搜索需要的模块:(模块名称都是根据功能功能的描述和检索得到的)
需求: 需要一个剔除字符串空格的模块,这个模块中可能包含关键词trim
命令行输入 npm i trim
项目中引入第三方模块 const trim = require(“trim”)
模块和包
模块指代的就是一个独立的js文件,包指代的是包含多个模块的一个文件夹
NodeJS应用
前端项目开发,一般都是创建一个文件夹,然后在文件夹中完善文件结构
后端项目开发,一般都有自己完善的项目结构
1.创建一个项目文件夹 。。。。、
2.文件中执行命令: npm init ,将这个文件夹初始化成一个后端应用
npm命令
npm : node Pacjage Management
Node包管理器,Node模块管理器
可以使用这个命令,完成第三方模块的安装、升级、卸载的工作
npm常见命令:
npm installl <modulle_name> :安装一个模块到系统中 install可以简写为i
npm list: 查看系统中安装的模块列表, 简写 npm ls
npm unisall <module_name> 从系统中删除一个模块 uninstall 可以简写为un
npm install <module_name> -g 将一个指定模块进行全局安装,所有Node项目都可以使用
npm install <module_name> -s 将一个模块安装给一个项目,其他项目不能使用等价于npm install <module_name> --save
npm install <module_name> -D 将一个指定模块咱装给一个项目;其他项目不能使用,这个安装只能在开发的时候使用;项目发布后不能使用 等价于 npm install <module_name> --save-dev