首先,我们来汇总一下 JavaScript 和 Node.js 的历史:
Node.js 是一个开源和跨平台的 Javascript 的运行时环境
运行时:程序在运行期间需要依赖的一系列组件或者工具;
把这些工具和组件打包在一起提供给程序员,程序员就能运行自己编写的代码了。
它让 JavaScript 脱离了浏览器环境,可以直接在计算机上运行,极大地拓展了 JavaScript 用途。
Node.js详细安装教程(2021)_cheerileeyoki的博客-CSDN博客_node.js安装教程
npm 是 Node.js 标准的软件包管理器。
在 2017 年 1 月时,npm 仓库中就已有超过 350000 个软件包,这使其成为世界上最大的单一语言代码仓库,并且可以确定几乎有可用于一切的软件包。
它起初是作为下载和管理 Node.js 包依赖的方式,但其现在也已成为前端 JavaScript 中使用的工具。
npm 可以管理项目依赖的下载。
安装所有依赖
npm install
安装单个软件包
npm install
更新软件包
//所有软件包更新
npm update
//单个软件包更新
npm update
安装类型分类
当使用 npm
安装软件包时,可以执行两种安装类型:
本地安装
默认情况下,当输入 npm install
命令时,例如:
npm install lodash
软件包会被安装到当前文件树中的 node_modules
子文件夹下。
在这种情况下,npm
还会在当前文件夹中存在的 package.json
文件的 dependencies
属性中添加 lodash
条目。
全局安装
使用 -g
标志可以执行全局安装:
npm install -g lodash
在这种情况下,npm
不会将软件包安装到本地文件夹下,而是使用全局的位置。
全局的位置到底在哪里?
npm root -g
命令会告知其在计算机上的确切位置。
修改镜像
npm 官方的管理的包都是从 http://npmjs.com 下载的
淘宝 npm 镜像:http://npm.taobao.org/ ,这是一个完整 npmjs.com 镜像,目前同步频率为 10 分钟一次
设置:
# 查看 npm 配置信息
npm config list
# 经过下面的配置,以后所有的 npm install 都会经过淘宝的镜像地址下载
npm config set registry https://registry.npm.taobao.org
假设使用以下命令安装了流行的 JavaScript 实用工具库 lodash
:
npm install lodash
这会把软件包安装到本地的 node_modules
文件夹中。
若要在代码中使用它,则只需使用 require
将其导入到程序中:
const x = require('lodash')
如果软件包是可执行文件,该怎么办?
在这种情况下,它会把可执行文件放到 node_modules/.bin/
文件夹下。
举个栗子
cowsay 软件包提供了一个命令行程序,可以执行该程序以使母牛说些话(以及其他动物也可以说话)。
当使用 npm install cowsay
安装软件包时,它会在 node_modules 文件夹中安装自身以及一些依赖包:
有一个隐藏的 .bin 文件夹,其中包含指向 cowsay 二进制文件的符号链接:
可以输入 ./node_modules/.bin/cowsay
来运行它,但是最新版本的 npm(自 5.2 起)中包含的 npx 是更好的选择。 只需运行:
npx cowsay
则 npx 会找到程序包的位置。
package.json
文件是项目的清单。 它可以做很多完全互不相关的事情。 例如,它是用于工具的配置中心。 它也是npm
和yarn
存储所有已安装软件包的名称和版本的地方。
使用 JavaScript、或者 与JavaScript 项目、Node.js 或前端项目进行交互时,都会遇到 package.json
文件。
package.json
文件中的内容没有固定的要求(可以为空)。 唯一的要求是必须遵守 JSON 格式,否则,尝试以编程的方式访问其属性的程序则无法读取它。
JSON格式采用key:value的方式记录数据,不支持注释
{}
{
"name": "nodejs_cn"
}
常见属性:
version
表明了当前的版本。name
设置了应用程序/软件包的名称。description
是应用程序/软件包的简短描述。main
设置了应用程序的入口点。private
如果设置为 true
,则可以防止应用程序/软件包被意外地发布到 npm
。scripts
定义了一组可以运行的 node 脚本。dependencies
设置了作为依赖安装的 npm
软件包的列表。devDependencies
设置了作为开发依赖安装的 npm
软件包的列表。engines
设置了此软件包/应用程序在哪个版本的 Node.js 上运行。browserslist
用于告知要支持哪些浏览器(及其版本)。
package-lock.json
会固化当前安装的每个软件包的版本,当运行npm install
时,npm
会使用这些确切的版本。
指定一个回调函数以供稍后执行,并指定希望它稍后运行的时间(以毫秒为单位)的值
const myFunction = (firstParam, secondParam) => {
//做些事情
}
//2秒之后运行
setTimeout(myFunction,2000,firstParam,secondParam)
当然也可以清除定时器
const id = setTimeout(() => {
// 设置事件在2秒之后运行
}, 2000)
// 清除定时器
clearTimeout(id)
如果将延迟设置为0,则回调函数会在 其它函数 执行结束后立即执行
const func1 = () => {
setTimeout(() => {
console.log('后者 ')
},0)
console.log(' 前者 ')
}
func1()
console.log("middle")
是一个类似于
setTimeout
的函数,不同之处在于:它会在指定的特定时间间隔(以毫秒为单位)一直地运行回调函数,而不是只运行一次
规则也和setTimeout()相似
const id = setInterval(() => {
// 每 2 秒运行一次
}, 2000)
clearInterval(id)
相当于使用 setTimeout(() => {}, 0))
JavaScript 默认情况下是同步的,并且是单线程的。 这意味着代码无法创建新的线程并且不能并行运行。
const a = 1
const b = 2
const c = a * b
console.log(c)
doSomething()
但是 JavaScript 诞生于浏览器内部,一开始的主要工作是响应用户的操作,例如 onClick
、onMouseOver
、onChange
、onSubmit
等。
使用同步的编程模型该如何做到这一点:
定义:这个函数被作为参数传给另一个函数去调用。这样的函数就是回调函数。
由于不知道用户何时单击按钮。 因此,为点击事件定义了一个事件处理程序。 该事件处理程序会接受一个函数,该函数会在该事件被触发时被调用:
document.getElementById('button').addEventListener('click', () => {
//被点击
})
这就是所谓的回调。
回调是一个简单的函数,会作为值被传给另一个函数,并且仅在事件发生时才被执行。
通常会将所有的客户端代码封装在 window
对象的 load
事件监听器中,其仅在页面准备就绪时才会运行回调函数:
window.addEventListener('load', () => {
//window 已被加载。
//做需要做的。
})
首先,我们需要区分同步和异步;
同时,异步和回调也不能划等号;而回调进一步可细分为同步回调和异步回调。
举个栗子
函数的执行顺序为 自上而下 顺序执行。
function f1(tag2){
tag2=tag2+1;
console.log("callback:"+tag2)
}
function f2(tag1,cb){
var tag2=tag1+1;
console.log("main:"+tag2)
return cb(tag2)
}
f2(1,f1)
相当于先执行程序的主要逻辑代码(主要逻辑代码指的是:比如例子中的console.log(“f1 finished”)),将耗时的操作推迟执行(耗时操作即f2)。
function f2() {
console.log('f2 finished')
}
function f1(cb) {
setTimeout(cb,1000) //用setTimeout()模拟耗时操作
console.log('f1 finished')
}
f1(f2); //得到的结果是 f1 finished ,f2 finished
优点:
缺点: