企业级项目开发中的交互式解释器以及global全局定义、Stream流的合理运用和实战【Note.js】

简介: 企业级项目开发中的交互式解释器以及global全局定义、Stream流的合理运用和实战【Note.js】

交互式解释器

Read Eval Print Loop:节点。Js REPL(Read-Eval Print Loop:交互式解释器)表示一个计算机环境,类似于Windows系统或Unix/Linux shell的终端,我们可以在其中输入命令并接收系统响应。
REPL的交互式编程环境可以实时验证您的代码,这非常适合验证Node J和JavaScript相关的API。

$ node
> 1 +4
5
> 5 / 2
2.5
> 3 * 6
18
> 4 - 1
3
> 1 + ( 2 * 3 ) - 4
3
>
AI 代码解读

该节点带有交互式解释器,可执行以下任务:
读取-读取用户输入,解析输入的Javascript数据结构并将其存储在内存中。

$ node
> var x = 0
undefined
> do {
... x++;
... console.log("x: " + x);
... } while ( x < 5 );
x: 1
x: 2
x: 3
x: 4
x: 5
undefined
>
AI 代码解读

Execute-执行输入的数据结构
打印-输出结果
循环-循环上述步骤,直到用户按下ctrl-c按钮两次退出。
Node的交互式解释器可以很好地调试Javascript代码。
开始学习REPL
我们可以输入以下命令来启动节点的终端:

$ node
> var x = 10
undefined
> var y = 20
undefined
> x + y
30
> var sum = _
undefined
> console.log(sum)
30
undefined
>
AI 代码解读

global全局定义

__filename当前模块的文件名——解析的绝对路径。
这不必与主程序命令行中使用的名称相同。__目录名以获取当前模块的目录名。
例如:
执行节点示例。js在/Users/mjr目录中

console.log(__filename);
// Prints: /Users/mjr/example.js
console.log(__dirname);
// Prints: /Users/mjr
AI 代码解读

给定两个模块:a和b,其中b是a的依赖项。
文件目录结构如下:
/用户/mjr/app/a.js
/用户/mjr/app/node_modules/b/b.js
B、 js__对文件名的引用将返回/Users/mjr/app/node_modules/B/B。Js a.Js__对文件名的引用将返回/Users/mjr/app/a.Js

单元导出对象由模块系统创建。有时这是不可接受的;许多人希望自己的模块是一个类的实例。要实现这一点,需要将预期的导出对象分配给模块导出请注意,将预期对象分配给导出将只需重新绑定本地导出变量,这可能不是预期的。
例如,假设创建了一个名为.js的模块:

const EventEmitter = require('events');

module.exports = new EventEmitter();

// 处理一些工作,并在一段时间后从模块自身触发 'ready' 事件。
setTimeout(() => {
  module.exports.emit('ready');
}, 1000);
AI 代码解读
const a = require('./a');
a.on('ready', () => {
  console.log('模块 a 已准备好');
});
AI 代码解读

exports变量在模块的文件级范围内有效。在执行模块之前将其分配给模块导出的值。
它有一个模块的快捷方式。导出F=…可以更简洁地写成导出F=注意,就像任何变量一样,如果为导出分配了新值,则它将不再绑定到module.exports:

module.exports.hello = true; 
exports = { hello: false }; 
AI 代码解读

从对模块的引用中导出。
不导出,只在模块内有效
模块代码在这。在这个例子中,定义了一个函数。
此时,exports 不再是一个 module.exports 的快捷方式,且这个模块依然导出一个空的默认对象。

function require(/* ... */) {
  const module = { exports: {} };
  ((module, exports) => {
   function someFunc() {}
    exports = someFunc;
    module.exports = someFunc;
    // 此时,该模块导出 someFunc,而不是默认对象。
  })(module, module.exports);
  return module.exports;
}
AI 代码解读

Stream流的运用

流是一个节点,Js是一个非常重要的模块,它被广泛使用。
流是一个抽象接口,由Node中的许多对象实现。例如,向http服务器发起请求的请求对象是Stream和stdout(标准输出)。
此抽象接口是可读的、可写的或两者兼有。通过这些接口,我们可以与磁盘文件、套接字和HTTP请求交互,以实现数据从一个地方流到另一个地方的功能。

var fs = require("fs");
var data = '';

// 创建可读流
var readerStream = fs.createReadStream('input.txt');

// 设置编码为 utf8。
readerStream.setEncoding('UTF8');

// 处理流事件 --> data, end, and error
readerStream.on('data', function(chunk) {
   data += chunk;
});

readerStream.on('end',function(){
   console.log(data);
});

readerStream.on('error', function(err){
   console.log(err.stack);
});

console.log("程序执行完毕");
AI 代码解读
var fs = require("fs");
var data = 'W3Cschool教程官网地址:www.w3cschool.cn';

// 创建一个可以写入的流,写入到文件 output.txt 中
var writerStream = fs.createWriteStream('output.txt');

// 使用 utf8 编码写入数据
writerStream.write(data,'UTF8');

// 标记文件末尾
writerStream.end();

// 处理流事件 --> data, end, and error
writerStream.on('finish', function() {
    console.log("写入完成。");
});

writerStream.on('error', function(err){
   console.log(err.stack);
});

console.log("程序执行完毕");
AI 代码解读

执行结果如下:

$ node main.js 
程序执行完毕
写入完成。
AI 代码解读

事件

大多数节点js核心API都采用传统的异步事件驱动架构。某些类型的对象(触发器)会周期性地触发命名事件以调用函数对象(侦听器)。
例如,net每次有新连接时,服务器对象都会触发一个事件;fs。ReadStream将在文件打开时触发事件;当数据可读时,流对象触发事件。
所有可以触发事件的对象都是EventEmitter类的实例。这些对象打开一个eventEmitter On()函数,该函数允许一个或多个函数绑定到将由对象触发的命名事件。事件名称通常是骆驼字符串,但也可以使用任何有效的JavaScript属性名称。

const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();
myEmitter.on('event', () => {
  console.log('触发了一个事件!');
});
myEmitter.emit('event');
AI 代码解读
const myEmitter = new MyEmitter();
myEmitter.on('event', function(a, b) {
  console.log(a, b, this);
  // 打印:
  //   a b MyEmitter {
  //     domain: null,
  //     _events: { event: [Function] },
  //     _eventsCount: 1,
  //     _maxListeners: undefined }
});
myEmitter.emit('event', 'a', 'b');
AI 代码解读

EventEmitter将按照注册的顺序同步调用所有侦听器。因此,有必要确保事件的正确顺序,避免竞争条件或逻辑错误。侦听器函数可以使用setImmediate()或process。nextTick()方法切换到异步操作模式:

const myEmitter = new MyEmitter();
myEmitter.on('event', (a, b) => {
  setImmediate(() => {
    console.log('这个是异步发生的');
  });
});
myEmitter.emit('event', 'a', 'b');
AI 代码解读
目录
打赏
0
0
0
0
154
分享
相关文章
Next.js 实战 (十):中间件的魅力,打造更快更安全的应用
这篇文章介绍了什么是Next.js中的中间件以及其应用场景。中间件可以用于处理每个传入请求,比如实现日志记录、身份验证、重定向、CORS配置等功能。文章还提供了一个身份验证中间件的示例代码,以及如何使用限流中间件来限制同一IP地址的请求次数。中间件相当于一个构建模块,能够简化HTTP请求的预处理和后处理,提高代码的可维护性,有助于创建快速、安全和用户友好的Web体验。
Next.js 实战 (九):使用 next-auth 完成第三方身份登录验证
这篇文章介绍了next-auth,一个为Next.js设计的身份验证库,支持多种认证方式,如电子邮件和密码、OAuth2.0提供商(如Google、GitHub、Facebook等)以及自定义提供商。文章包含了如何配置Github Provider以及会话管理,并提到了适配器Adapters在next-auth中的作用。最后,文章强调了next-auth的强大功能值得进一步探索。
74 10
Next.js 实战 (八):使用 Lodash 打包构建产生的“坑”?
这篇文章介绍了作者在使用Nextjs15进行项目开发时遇到的部署问题。在部署过程中,作者遇到了打包构建时的一系列报错,报错内容涉及动态代码评估在Edge运行时不被允许等问题。经过一天的尝试和调整,作者最终删除了lodash-es库,并将radash的部分源码复制到本地,解决了打包报错的问题。文章最后提供了项目的线上预览地址,并欢迎读者留言讨论更好的解决方案。
41 10
Next.js 实战 (七):浅谈 Layout 布局的嵌套设计模式
这篇文章介绍了在Next.js框架下,如何处理中后台管理系统中特殊页面(如登录页)不包裹根布局(RootLayout)的问题。作者指出Next.js的设计理念是通过布局的嵌套来创建复杂的页面结构,这虽然保持了代码的整洁和可维护性,但对于特殊页面来说,却造成了不必要的布局包裹。文章提出了一个解决方案,即通过判断页面的skipGlobalLayout属性来决定是否包含RootLayout,从而实现特殊页面不包裹根布局的目标。
90 33
Next.js 实战 (六):如何实现文件本地上传
这篇文章介绍了在Next.js中如何实现文件上传到本地的方法。文章首先提到Next.js官方文档中没有提供文件上传的实例代码,因此开发者需要自行实现,通常有两种思路:使用Node.js原生上传或使用第三方插件如multer。接着,文章选择了使用Node.js原生上传的方式来讲解实现过程,包括如何通过哈希值命名文件、上传到指定目录以及如何分类文件夹。然后,文章展示了具体的实现步骤,包括编写代码来处理文件上传,并给出了代码示例。最后,文章通过一个效果演示说明了如何通过postman模拟上传文件,并展示了上传后的文件夹结构。
Next.js 实战 (五):添加路由 Transition 过渡效果和 Loading 动画
这篇文章介绍了Framer Motion,一个为React设计的动画库,提供了声明式API处理动画和页面转换,适合创建响应式用户界面。文章包括首屏加载动画、路由加载Loading、路由进场和退场动画等主题,并提供了使用Framer Motion和next.js实现这些动画的示例代码。最后,文章总结了这些效果,并邀请读者探讨更好的实现方案。
Next.js 实战 (四):i18n 国际化的最优方案实践
这篇文章介绍了Next.js国际化方案,作者对比了网上常见的方案并提出了自己的需求:不破坏应用程序的目录结构和路由。文章推荐使用next-intl库来实现国际化,并提供了详细的安装步骤和代码示例。作者实现了国际化切换时不改变路由,并把当前语言的key存储到浏览器cookie中,使得刷新浏览器后语言不会失效。最后,文章总结了这种国际化方案的优势,并提供Github仓库链接供读者参考。
105 5
|
2月前
Next.js 实战 (三):优雅的实现暗黑主题模式
这篇文章介绍了在Next.js中实现暗黑模式的具体步骤。首先,需要安装next-themes库。然后,在/components/ThemeProvider/index.tsx文件中新增ThemeProvider组件,并在/app/layout.tsx文件中注入该组件。如果想要加入过渡动画,可以修改代码实现主题切换时的动画效果。最后,需要在需要的位置引入ThemeModeButton组件,实现暗黑模式的切换。
|
2月前
Next.js 实战 (二):搭建 Layouts 基础排版布局
本文介绍了作者在Next.js v15.x版本发布后,对一个旧项目的重构过程。文章详细说明了项目开发规范配置、UI组件库选择(最终选择了Ant-Design)、以及使用Ant Design的Layout组件实现中后台布局的方法。文末展示了布局的初步效果,并提供了GitHub仓库链接供读者参考学习。
Next.js 实战 (二):搭建 Layouts 基础排版布局
JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式
本文深入探讨了JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式,结合电商网站案例,展示了设计模式如何提升代码的可维护性、扩展性和可读性,强调了其在前端开发中的重要性。
57 2

热门文章

最新文章

  • 1
    当面试官再问我JS闭包时,我能答出来的都在这里了。
    45
  • 2
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    28
  • 3
    Node.js 中实现多任务下载的并发控制策略
    34
  • 4
    【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
    26
  • 5
    【JavaScript】深入理解 let、var 和 const
    49
  • 6
    【04】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架二次开发准备工作-以及建立初步后端目录菜单列-优雅草卓伊凡商业项目实战
    47
  • 7
    【03】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架搭建-服务端-后台管理-整体搭建-优雅草卓伊凡商业项目实战
    57
  • 8
    【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
    57
  • 9
    如何通过pm2以cluster模式多进程部署next.js(包括docker下的部署)
    72
  • 10
    【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
    55