blog
blog copied to clipboard
🌈 技术博客,记录日常工作学习的整理~欢迎star
课本的知识,需要温故而知新,做个笔记吧 ## open_file & file_description > 在Linux中一切皆可以看成是文件,有`普通文件`、`目录文件`、`链接文件`和`设备文件`。 然而,进程访问文件数据必须要先“打开”这些文件。内核为了跟踪某个进程打开的文件,则用一个个`文件描述符`组成了一个`打开文件表`。 ### 文件描述符 (file_description) * 文件描述符仅是`打开文件`的标识,是系统内核为了高效管理已经被打开的文件所创建的索引。因为文件系统中`所有的文件数`目与`当前打开`的数目是有数量级差别的。  * 一个`文件描述符`只能够指向一个文件,但是一个文件会有多个`文件描述符`去描述它。 * 索引一般是小整数,所有执行`I/O`调用的系统操作都需要通过`文件描述符`,文件描述符一般从`3`开始计算 * 程序刚启动的时候 0指代标准输入,1指代标准输出,2指代标准错误 * POSIX标准要求,每次打开文件的时候,都必须使用最小的可用序号。下图则是`Linux`中某个进程的文件描述符情况。  * 文件描述符,既然是描述符,都描述了什么内容呢? * ##### 文件指针 最近的一次读写位置。每个进程分别维护自己的文件指针。...
# Decorator 本文的主角是`decorator`,字面意思是`装饰器`。前端的同学大概都知道,它当前处于`stage 2`阶段([草案原文](https://github.com/tc39/proposal-decorators/blob/master/README.md)),可以用`babel`进行[转码](https://www.babeljs.cn/repl#?browsers=&build=&builtIns=false&spec=false&loose=false&code_lz=AIFwpgziCGBGA2YBQBje0IQAQAUwCcIB7AOywG8ksth8xoATU-ATyppNLBIFcBbAnETsS0AQAoAlBSx0QPfGQAGAEnIgAFgEsIAOgBmWwiAC-WNZp270UE0qwmkJoA&debug=false&forceAllTransforms=false&shippedProposals=false&circleciRepo=&evaluate=false&fileSize=false&timeTravel=false&sourceType=module&lineWrap=true&presets=es2015%2Creact%2Cstage-2&prettier=false&targets=&version=7.9.6&externalPlugins=)后进行使用。 使用过`Angular 2`或者`Nest.js`(或者`Midway.js`)的同学,一定对`@Component`、`@Inject`、`@ViewChild`和`@get()`、`@post()`、`@provide()`不陌生。 了解设计模式的同学,大概还记得`修饰器模式`这东西,也许至今也还分不太清楚它和`代理模式`的差别。 但这次,我们想要追本溯源,从`AOP`、`IOC`和`descriptor`这些东西说起,认识一下`修饰器`这个熟悉的陌生人。 ## "脑壳疼"de问题 在正文开始之前,我们先来一个需求,我们将陆续用不同阶段的思维去实现这个要求。 > 要求是:已知一个超过10几个人维护的代码,在不修改原函数的情况下,如何实现在每个函数执行后打印出指定内容的一行日志。 ## AOP > In computing, aspect-oriented programming (AOP) is a programming paradigm that aims to increase modularity...
# 前端模块化 - Webpack > "Node.js 从最一开始就支持模块化编程。然而,在 web,模块化的支持正缓慢到来。在 web 存在多种支持 JavaScript 模块化的工具,这些工具各有优势和限制。webpack 基于从这些系统获得的经验教训,并将_模块_的概念应用于项目中的任何文件。" 从 `Webpack 4`对模块化的面数来看,深知自己的历史任务深重,所以扛起了所有的前端几乎所有的模块化方案: * `ES6`的 `import` 与 `export` 语句 * `CommonJS` 的 `require` 与 `module.exports` * `AMD`...
## 溯源 > CMD 规范集合了CommonJS 和 AMD,取长补短。其最有名的实现是射雕的[sea.js](https://seajs.github.io/seajs/docs/) ## 语法规范 ### 模块定义 ```js define(function(require, exports, module) { // 同步引入模块 const module2 = require('./module2') // 异步引入模块 const module1 = require('./module3', function (module3)...
## 溯源 > AMD 是一种模块管理规范,全称是`Asynchronous Module Definition`(异步模块定义)。其中一个实现则是著名的[require.js](https://requirejs.org/)。 ## 特点 AMD的最大特点是他的`A` ==> `Asynchronous`,规范规定模块的加载过程是异步的,不会影响侯后续的代码执行。 > 同步加载模块会阻塞浏览器的代码执行,是当初AMD产生的主要原因。 ##### CommonJS 写法 ```js require(['really-big-module']); const bigData = new BigData() bigData.getData() // 被模块加载阻塞的操作 console.log('some action') ```...
## 值的拷贝 与 值的 引用 * `CommonJS` 引入的是模块值一个拷贝 * `ES 6 module`引入的是暴露对象的引用,本质上是暴露了一个指向对应内存空间的指针,模块内部值改变,外部引用值也会改变。 ## this的指向 * 在模块中 `CommonJS`的`this`指向当前模块 * 而ES 6 module中this指向的是`undefined`。 同时,`ES 6`模块中也不存在 `arguments`、`require`、`module`、`exports`、`__filename`、`__dirname`这些对象 ## 处理的阶段 * CommonJS 在执行阶段进行处理 *...
## 溯源 * 与前辈`CommonJS`、`AMD` 不同, 而`ES6` 尝试在语言层面上实现了模块化的功能 * `CommonJS` 与 `AMD` 都需要程序运行时才能够知道模块之间的依赖关系。而`ES 6 Module`要做到的是尽量的静态化,在编译时就确定模块的依赖关系,以及输出和输出的内容。 ## export ##### 建立对应关系 > `export` 命令规定的是对外的接口,起的作用必须是与模块内部建立起`一以对应`的关系。 ##### 动态绑定 > `export`语句输出的接口,与其对应的是动态绑定的关系,模块内部值的变化,会引起外部引用的变化。 例子一: ```js // modulesA.js export...