node .js不是一门新的语言,它是一个平台,提供了javascript运行环境。在node中,javascript的DOM,BOM不能在用,其他的正常,可以通过javascript操作文件,和连接数据库。
前端模块化怎么来的
前端本来是没有模块化概念的,以前也没有前端这个岗位,那个时候简单的交互都是通过后端将代码发送到前端实现的。随着ajax的出现,javascript发挥了更大的作用,随之而来的就是页面交互变得复杂,前端代码大量增长,为了提高代码的复用率,函数大量使用。而函数就可以看成是前端模块化雏形。函数多了也可能重名,且调用复杂,就把众多函数写成一个对象。但这样也有缺点,调用对象的时候有可能将对象的属性修改,内部状态可以被外部修改。为了无法访问内部状态使用立即执行函数,执行完之后,立马销毁。销毁了,有些需要保存函数状态值的地方,就不能使用了。使用闭包既可以不污染变量又可以,又可以重复使用,可闭包也有缺点呀,变量所在内存无法被销毁,使用的越多,对性能的影响越大。模块化处理分为两种方式,一种是在浏览器运行的时候加载模块,是在线编译的相当于在浏览器上加了一个解释器( seajs / requirejs )。另外一种是预编译模式,在使用之前就将模块化内容转换为浏览器可执行的代码(browserify / webpack)。预编译模式更加可靠。
练习
在Es6中如何导出模块
import命令具有提升效果,会提升到整个作用域的最前面
使用 export导出模块,
export class Compute{
constructor(a,b){
this.a=a;
this.b=b;
}
add(){
return this.a+this.b;
}
subtract(){
return this.a-this.b;
}
mulpitly(){
return this.a*this.b;
}
divide(){
return this.a/this.b;
}
}
使用 import {…} from 模块地址/名 导出模块
import {Compute} from "./a.js";
import {b} from "./c.js";
var cantent=new Compute(10,5);
console.log(cantent);
默认导出 export default … 默认导出 不需要变量接受自己定义;
export default '你好';
导入改名
import {Compute as con} from "./a.js";
导出改名
let name_1='张三';
let name_2='李四';
export {name_1 as z,name_2 as li};
补充下面代码
//moudle5.js
export class Point {
constructor(x, y) {
this.x = x;
this.y = y;
}
toString() {
return this.x + '\t' + this.y;
}
}
//index.js
let p=new Point(2,3);
console.log(p.toString());
补充
//moudle5.js
export class Point {
constructor(x, y) {
this.x = x;
this.y = y;
}
toString() {
return this.x + '\t' + this.y;
}
}
//index.js
import {Point} from './moudles.js'
let p=new Point(2,3);
console.log(p.toString());
在下滑线处补充完下面moudle6.js模块的程序
//moudle6.js
_______function (x, y) {
return x * y;
}
//index.js
import myMethod from './moudle6'
console.log(myMethod(2,2))
改动
//moudle6.js
export function (x, y) {
return x * y;
}
//index.js
import myMethod from './moudle6'
console.log(myMethod(2,2))
下面程序打印的结果为?
//lib.js文件
export let foo = ()=> {console.log("fnFoo") ;return "foo"},bar = "stringBar";
//main.js文件
import {foo, bar} from "./lib";
console.log(foo());
console.log(bar);
结果
'fnFoo'
'stringBar'
add.js
export let add=(a, b) => {
if (typeof a == 'number' && typeof b == 'number') {
return a + b
} else {
return 0
}
}
//main.js文件
import {add} from "./add";
console.log(add(10,'a'));
0
下面程序执行结果为?
// a.js
import {bar} from './b';
console.log('a.js');
console.log(bar);
export let foo = 'foo';
// b.js
import {foo} from './a';
console.log('b.js');
console.log(foo);
export let bar = 'bar';
执行node a.js运行结果为
'b.js'
'foo'
'a.js'
'bar'
完善格式化日期模块 年-月-日 时:分:秒
let times=(data)=>{
var y=data.getFullYear();
var m=data.getMonth()+1;
var d=data.getDate();
var h=data.getHours();
var min=data.getMinutes();
var s=data.getSeconds();
var temp=`当前时间${y}年${m}月${d}日${h}点${min}分${s}`;
return temp;
}
let time_2=()=>{
let data=new Date();
var y=data.getFullYear();
var m=data.getMonth()+1;
var d=data.getDate();
var h=data.getHours();
var min=data.getMinutes();
var s=data.getSeconds();
var temp=`当前时间${y}年${m}月${d}日${h}点${min}分${s}`;
return temp;
}
export {
times,
time_2
}
封装一个计算器模块 加减乘除
export class Compute{
constructor(a,b){
this.a=Number(a);
this.b=Number(b);
}
judge(){
if(typeof this.a!='number'){
return '请输入数字';
}
else{
return '输入的是数字' ;
}
}
add(){
this.judge();
return this.a+this.b;
}
subtract(){
this.judge();
return this.a-this.b;
}
mulpitly(){
this.judge();
return this.a*this.b;
}
divide(){
this.judge();
return this.a/this.b;
}
}
使用
import {Compute as con} from "./a.js";
// import {b} from "./c.js";
// import {z,li} from "./ss.js";
// // import {times,time_2} from './times.js';
// console.log(b);
// console.log(z,li);
var cantent=new con(3,"8");
console.log(cantent.judge());
console.log(cantent.add());
效果
未续待完。
node .js
不导模块的api
运行在node上,global相当于浏览器上的window,
global.console.log(111);
__dirname 文件所在目录。
__finename 文件所在地址
console.log('dirname:',__dirname)
console.log('filename:',__filename);
process.arch 获得操作系统信息
process.argv 得到数组,第一个值代表node安装地址,第二个值,当前文件夹地址。
global.console.log(process.argv);
global.console.log(process.arch);
path模块
导入模块
const path=require('path');
path.extname()得到的是文件的后缀名,如果是目录则没有后缀名。
console.log(path.extname('./a.js'));
当前文件夹,当前文件所在目录
console.log(path.dirname(__dirname));
console.log(path.dirname(__filename));
解析地址把字符串转化为对象
global.console.log(path.parse(__filename));
解析地址把对象转化为字符串
global.console.log(path.format(temp));
absolute判断是否绝对路径,服务器环境下,目录最前面有/的就速绝对路径
返回布尔值
global.console.log(path.isAbsolute('./src'));
path.join路径拼接
‘…’ 是返回上级
global.console.log(path.join(__dirname,'my','txt.txt'));
global.console.log(path.join(__dirname,'my','txt.txt','..'));
global.console.log(path.join('my','text/text','js.js'));
global.console.log(path.join('my','tex/rexc','wadfaf','dawd'));
相对路径找地址,从第一个找到第二个
//path.relative(form,to);
global.console.log(path.relative('D:\\作业\\20210420\\practice\\src','D:\\作业\\20210420\\practice\\dir'));
路径解析
global.console log(path.normalize('d:\\\\20210420\\practice\\src'));
path.posix 包含了path常用方法,输出可以得到
global.console.log(path.posix);
fs
导入 fs 模块
const fs=require('fs');
创建文件夹
fs.mkdir(文件名/地址,回调函数)
fs.mkdir('w',(err)=>{
if(err){console.log('文件')}
console.log('创建成功');
});
删除文件夹
fs.rmdir(文件名/地址,回调函数)
fs.mkdir('w',(err)=>{
if(err) throw err;
console.log('文件已移除');
});
读取文件目录
fs.readdir(文件地址,回调函数)
fs.readdir('src',(err,files)=>{
if(err) throw err;
console.log(files);
});
检测文件状态
fs.stat(文件地址/名,回调函数)
返回布尔值
fs.stat('src',(err,stats)=>{
global.console.log(stats.isFile)检测是否是文件
global.console.log(stats.Directory)判断是文件还是文件夹
});
读取当前目录,判断当前目录下每一个文件的状态。
fs.readdir(__dirname,(err,files)=>{
if(err) throw err;
console.log(files)
files.forEach((item,index)=>{
fs.stat(path.join(__dirname,item),(err,stats)=>{
if(stats.isDirectory()){
console.log(item+'是一个目录')
}else{
console.log(item+'是一个文件夹')
}
})
})
})
写文件 创建一个新的文件
fs.writeFile('文件名','数据',(err)=>{
if(err) throw err;
})
删除文件
fs.unlink('文件名',(err)=>{
if(err) throw err;
})
读文件
fs.readFile('文件名',(err,data)=>{
if(err) throw err;
global.console.log(data.toString());
})
http
http模块需要引入
const http=require('http');
创建服务器
let server=http.createServer((req,res)=>{
})
//端口号
server.listen('8989')
req是客户端传回来的数据
res是传给客户端的数据
//传给客户端数据
res.write('111')
res.end('word');
res.end()传送数据之后会结束响应,结束响应之后后面的都不执行
需要声明编码方式避免乱码
res.writeHead(200,{'Content-Type':'text/plain;charset=utf-8'});
req.url代表的是用户输入的路由/路径 除了ip和端口号以外的地址
req.url
favicon.ico自动请求 favicon.ico暂时不需要可以不用处理
if(req.url=='/favicon.ico') return;
a.startsWith(‘b’) 检测b是否以a字符串开头,返回布尔值
可以用来检测输入的路径是否符合要求
if(req.url.startsWith('/html')){
fs.readFile(path.join(__dirname,req.url),(err,data)=>{
if(err) throw err;
res.end(data);
})
}
post请求是一段一段发送的
req.on(‘data’,(回调函数))接收数据事件
回调函数的参数是传过来的数据
req.on('data',(chunk)=>{
global.console.log(chunk);
})
req.on(‘end’,()=>{});数据接收完事件
req.on('end' ()=>{
global.console.log('数据接收完毕');
})
url
引入url模块
const url=require('url');
url.parse() 解析地址栏拼接的信息,可以把地址字符串转换为对象,前台通过 get请求方式需要这种解析
url.parse(req.url,true)
通过键值对调用
let password=url.parse(req.url,true).query.password;
let name=url.parse(req.url,true).query.name;
将接收到的数据在返回到前台
res.end(`用户名${name}<br>密码${password}`
未续待完;