问:nodejs到底是什么?
- 答:nodejs不是一种独立的编程语言 nodejs也不是javascript框架 nodejs是一个javascript运行环境 一个和浏览器一样的javascript的宿主环境
问:nodejs和javascript之间的关系?
- 答:nodejs是一个运行javascript的宿主环境,和浏览器一样提供很多供开发者调用的API接口,其通过javascript中ECMAScript规范语法去调用
问:nodejs能做什么?
- 答:可做后端web服务器开发,客户端网络爬虫开发,I/O操作 脚手架命令行工具 图形界面的开发工具
问:如何搭建nodejs?
- 答:在官网根据不同电脑系统的平台不同,下载对应系统的安装包,正常安装就可以 node --version查看版本
问:如何在nodejs中运行javascript?
- 答:node 路径/文件名.js
文件操作与模块化编程的概念?(参考nodejs官网-文档)
问:如何读取文件的内容?
- 答:引入node的内置模块fs 调用fs接口中的readFile方法 参数(1路径文件名 2字符编码通常utf-8 3回调函数(err,data)) 文件内容在data中
问:如何向文件中写入内容?
- 答:引入node的内置模块fs 调用fs接口中的writeFile方法 参数 (1路径文件名 2写入的内容 3回调函数(err))----注意点整个文件的内容清空
问:如何向文件中追加一段内容?
- 答:追加 = 读取,另起变量保存原有+新的,写入
问:require是什么?
- 答:因为node中代码结构时模块化的,内部拆分代码,相互独立,可供给导入导出,其中我们导入模块中用到的就是借助 require
问:我们为什么需要模块化?
- 答:假设我们团队中a和b各自开发一个功能,功能中恰巧有一个同名的变量,主文件中都依次引入了a和b的文件,这时候我们要使用a文件的这个变量,但是结果出来的确实b,因为在主文件中,a和b开发者写的功能文件中都有一个假如定义为dev的变量,依次引入会导致后者覆盖前者的情况,不过以前的前辈开发者们通过函数中独有的作用域环解决了这个情况,
- 后来出现了几种模块化 解决方案 服务器端CommonJS(社区) 浏览器端ADM UMD(社区) 官方ECMAScript Module(ESmodel)
问:javascript 有哪些模块化规范?
- 答:服务器端CommonJS(社区) 浏览器端ADM UMD(社区) 官方ECMAScript Module(ESmodel-es6特性)
- node 使用ESM 1 xxx.mjs 2 package.json { "type":"module" } 默认使用CommonJS
- node 使用CommonJS 1.导出 module.exports={...xxx} 2.导入 const xxx = require('文件')
node 工具 包管理器 npm www.npmjs.com npm init 元数据配置文件
问:什么是脚手架?
- 答:全局命令行工具 创建项目初始化文件以及目录
问:脚手架的基本能力有哪些?
- 答:全局命令行执行能力 命令行交互能力 项目初始化下载能力
问:如何实现一个自己的脚手架工具?
- 答:1创建自定义全局命令 2命令行参数接受处理 3终端交互 4下载远程项目代码 5项目初始化完成提示
创建脚手架
创建全局命令
- 创建bin文件夹/cli.js npm init cli文件中 顶部加入 #!/usr/bin/env node
- 创建全局命令 根目录 npm link
- cli文件中 通过process.argv 获取用户输入的参数 示例
- 实际通过commander 命令参数处理工具 处理用户输入的参数
- npm i commander
- const { program } = require('commander')
- program.option('-f -framwork ') 示例 --help的提示
- program.parse(process.argv)
- 示例 命令 --help
自定义指令
- program
- .command('creat [other...]') 示例
- .alias('crt') ---别名
- .description('创建项目') ---描述
- .action((project,args)=>{}) ---获取参数 命令行的执行逻辑代码
问答交互工具inquirer
- npm install --save inquirer@^8.0.0 CommonJS 引入 否则是ESM引入
- inquirer.prompt([{
-
type:'list',----input,list -
name:'framwork',----'', -
choices:['expree','koa','egg'] -
message:'请选择你所使用的框架’} - ]).then((answer)=>{console.log(answer)})
下载远程项目代码
-
download-git-repo
-
const download = require('download-git-repo')
-
download('github.com/pagekit/vue…
-
console.log(err); -
})
-
git-clone
-
const gitclone = require('git-clone')
-
gitclone('github.com/pagekit/vue…
-
console.log(err) -
})
下载代码过程中的提示
-
ora 注意是CommonJS(version5.xxx) 还是ESM 引入 - const ora = require('ora')
- const spinner = ora()
- spinner.text='loading....'
- setTimeout(() => {
-
console.log('耗时3秒') -
spinner.succeed('结束') - }, 3000);
- spinner.start()
命令行样式渲染工具 chalk
- 注意是CommonJS(version4.xxx) 还是ESM 引入
- console.log(chalk(xxxxxx))