node.js是一种后端开发语言,为什么做为一个前端开发,需要了解Node.js语言呢?
Node是一个基于Chrome v8引擎的JavaScript代码运行环境
官网地址
根据系统选择去相对应的安装包下载
下载完成后,进入安装、安装时选择的文件夹名称不要使用中文名称的文件夹
。安装过程中一直使用默认值,安装即可。
安装完成后,需要查看Node是否完成,打开命令行界面输入Node -v
即可查看是否安装完成
存储系统中的目录,在命令行中执行命令的时候系统会自动的去这些目录中查找命令的位置。
比如:QQ音乐 我现在要通过命令 在powershell 窗口 打开它
只需要进行以下操作:
1、找到可执行文件所在的目录
2、复制到,添加,即可在命令行界面输入 QQMusic 打开了
JavaScrip由三部分组成,
ECMAScript、DOM、BOM
Noed.js是由
ECMAScript
、Node环境
提供的一些附加API
组成的,包括文件网络、路径等等一些强大的API
所有的ECMAScript语法在Node环境中都可以使用,比如for循环,if判断等等
创建一个js文件,使用基础的ECMAScript语法
var fast = 'helloworld'
console.log(fast);
function fn(){
console.log('这个函数被调用');
}
fn();
for(var i=0;i<5;i++){
console.log(i);
}
现在Node的这个js文件该怎么去执行他呢?
JavaScript在使用时存在两大问题,
文件依赖
和命名冲突
文件依赖:有时候我们要实现某项功能时,发现引入a.js文件不行、它是依赖于b.js的,我们又在文件中引入了b.js。在进行实现的时候,还是不行需要引入c.js文件。这样实现这个功能的时候,就会比较繁琐和复杂了。
命名冲突:JavaScript语法本身是不严谨的,我们在使用时,命名的变量,会发生冲突,在引用时。这就会导致一些问题的出现
举个例子:比如主机,就是由多个模块组合而成的,有显卡,硬盘、风扇、主板等等。我们其中有一个坏了,需要更换,只需要换相对应的模块就可以了。
一个功能就是一个模块,多个模块可以组成完整应用,抽离一个不会影响其他功能的运行
JavaScript
就是一个模块,模块内部定义变量和函数
在外部是无法得到的
exports对象进行成员导出
,使用require方法
导入其他模块a.js
//a.js
//在模块内部定义变量
let vae = 1;
//在模块内部定义方法
const say = name => `小hu同学`,${
name}`;
//向外部导出数据
exports.vae = vae;
exports.say = say;
b.js
//b.js
//在b.js导入模块a
let a = require('./b.js');
//输出b模块中的versuion变量
console.log(a.vae);
//调用b模块中的say方法并输出其返回值
console.log(a.say('男'));
module.exports.vae = vae;
module.exports.say = say;
代码实例:b.js文件应用a.js文件的模块方法
a.js
const vae = name =>`hello ${
name}`;
module.exports.vae = vae
b.js
//这句代码的意思就是说引入a文件的路径,赋值给变量a
const a = require('./a.js');
//这句话的意思是说将a文件下的vae 方法传第一个值,并在控制台打印出来
console.log(a.vae('小hu同学'))
区别:exports是module.exports的别名(地址引用关系),导出对象以module.exports为准
如果当module.exports和exports分别指向的是不同的两个方法或者文件时,以module.exports为准
Node运行环境提供的API,因为这些API都是以模块化的方式进行开发的,所以我们又称为Node运行环境提供的API为系统模块
f:file文件,s:system系统,文件操作系统
const fs = require('fs')
fs.reaFile('文件路径/文件名称'[,'文件编码'],callback);
读取文件语法示例
//读取目录下中的01js文件
fs.reaFile('./01-helloworld.js','utf-8'(err,doc) =>{
//如果文件读取发送错误参数err的值为错误对象 否则err的值为null
//doc参数为文件内容
if(err == null){
//在控制台中输出文件内容
console.log(doc);
}
})
fs.writeFile('文件路径/文件名称',‘数据’,callback);
代码示例:
const fs = require('fs')
fs.writeFile('./demo.txt','即将要写入的内容',err =>{
if(err !=null){
console.log(err);
return;
}
console.log('文件内容写入成功');
})
为什么要进行路径拼接
path.join('路径1','路径2',....)
代码实例
//我们要拼接一个文件夹路径
// abc/def/hig
//引入path系统模块
const path = require('path');
//使用path.join拼接路径,并返回给一个变量 fpath
const fpath = path.join('abc','def','hig');
//打印出来fpath这个变量
console.log(fpath)
代码示例:
const fs = require('fs');
fs.readFile('./01-helloworld.js','utf8',(err,doc) =>{
console.log(err)
console.log(doc)
})
显示的是文件读取成功了 在同一个文件目录下面是可以读取到的
现在我们回到这个文件夹的上一级文件夹,我们来试一下看看还能不能读取成功
写相对路径会不安全,也又是会发生读取不到的文件情况
所以一般情况下,是写绝对路径比较好,绝对路径怎么写呢?
代码示例:
const fs = require('fs')
const path = require('path')
console.log(__dirname);
console.log(__dirname,'01-helloworld.js');
fs.readFile(path.join(__dirname,'01-helloworld.js'),'utf8',(err,doc)=>{
console.log(err);
console.log(doc);
})
别人写好的、具有特定功能的、我们能直接使用的模块为第三方模块,由于第三方模块通常都是由多个文件组成并且被放置在一个文件夹中,所以又被称为包
第三方模块有两种存在的形式
npmjs.com: 第三方模块的存储和分发仓库
npm: node的第三方模块管理工具
这样就是下载成功了
下载好后,文件夹里面会出现一个node_modules 文件夹,里面存放的就是下载好的第三模块,还有一个package.json文件
全局安装和本地安装
nodemon
是一个命令行工具,用以辅助项目开发
在Node.js中,每次修改文件都要在命令行工具中重新执行该文件,会比较麻烦
nodemon能为我们做什么?
它是会帮我们自动执行node.js的一个工具,在保存js文件后,命令行会自动帮我们执行命令,不用在去手动执行命令
使用的步骤:
npm install nodemon -g
下载它(-g 代表的是全局安装)nodemon
命令代替node
命令执行文件nrm:npm 下载地址切换工具
npm 默认的下载地址在国外,国内下载速度慢
有时候就需要切换为国内的下载
使用步骤
npm install nrm -g
下载它nrm ls
nrm use 下载地址名称
这样就下载好了,可用看到我们花费的时间比较长,大概花了2分钟, npm warn 不用理会,只要没有出现红色的就可以了
使用nrm ls 查询下载地址,有的小伙伴会发生下面这种情况因为在此nrm : 无法加载文件 C:\Users\ASUS\AppData\Roaming\npm\nrm.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/g o.microsoft.com/fwlink/?LinkID=135170 中的 about_Execution_Policies。
解决办法:
1、以管理员身份打开 Powershell窗口
2、输入命令 set-ExecutionPolicy RemoteSigned
3、输入Y 回车
执行 nrm ls,又报错了(心态有点不好了,淦!)
本着解决问题的态度(不解决,我咋继续跟你们说后面的呢),找到了解决办法。
解决办法:
1、找到nrm 安装的路径
2、由于我这里是演示全局安装,路径安装在C:\Users\ASUS\AppData\Roaming\npm\node_modules\nrm
3、打开里面的 cli.js文件,找到下图的这一行代码 删掉
const NRMRC = path.join(process.env[(process.platform == 'win32') ? 'USERPROFILE' : 'HOME'], '.nrmrc');
5、这下我们在去执行 nrm ls 看看 ,可以看到已经成功了
6、使用nrm use taobao
切换为taobao的这个下载地址
7、切换成功了
基于node 平台开发的前端构建工具
将机械化操作编写成任务,想要执行机械化操作执行一个命令任务就自动执行了
1、使用npm install gulp
下载gulp库文件
2、在项目根目录下建立gulpfile.js(文件名称不能更改)
3、重构项目的文件夹结构src目录放置源代码,文件dist目录放置构建后的文件
4、gulpfile.js文件中编写任务
5、在命令行工具中执行gulp任务
gulp.src(): 获取任务要处理的文件
gulp.dest(): 输出文件
gulp.task(): 建立gulp任务
gulp.watch():监控文件的变化
代码示例
const gulp = require('gulp');
//使用gulp.task()方法建立任务
// first 任务名称
gulp.task('frist',() =>{
//获取要处理的文件
gulp.src('./src/css/base.css')
//将文章输出到dist目录下面的CSS目录
.pipe(gulp.dest('./dist/css'));
});
执行gulp文件,还需要下载第三方模块 npm install gulp-cli-g
我们全局安装它
现在就可以在项目的根目录下面去执行 gulp frist函数了(这里的frist是任务的名称)
插件使用示例:压缩一个HTML文件(可参考API文档)
要想使用这个插件需要提前下载它,可以参考插件地址的下载命令 npm install gulp-htmlmin
//引入gulp模块
const gulp = require('gulp');
const htmlmin =require('gulp-htmlmin');
const fileinclude = require('gulp-file-include');
//1.html文件中代码的压缩操作
gulp.task('htmlmin',()=>{
// *.html 表示所有的html文件
gulp.src('./src/*.html')
// 压缩html文件中的代码
.pipe(htmlmin({
collapseWhitespace: true }))
//输出到dist目录下面的 html目录
.pipe(gulp.dest('dist/html'));
});
在传递文件过程中,不需要传递
node_modules
这个文件夹,因为package.json
会记录依赖的项,当接收到项目后,会根据package.json去下载依赖项
使用命令npm init -y
命令生成
当拿到项目的时候,执行npm install 即可自动下载 package.json中存储的依赖
{
"dependencies": {
"art-template": "^4.13.2",
"dateformat": "^4.5.1"
}
}
{
"devDependencies": {
"gulp": "^4.0.2",
}
}
记录了,文件与文件中的依赖关系
require(’./a.js’);
require(’./a’);
require(‘a’)
好了,这一篇关于Node.js的文章就到这里结束了,我会将这个Node分成几篇文章去写,一是方便理解吸收,二是时间有限,没有很多的时间去码字。感兴趣的可以关注一下,一键三连啊!