本文主要汇总开发中后端、语言,遇到的小问题以及对小问题的研究
require
node使js可以运行于后台,于是就有了对模块的需要。
require的解决方式是将模块中的所有对象(变量、函数、类)都成为一个对象module.exports对象的子对象,然后在其他模块中直接通过require模块名来引用导出的molule.exports对象,来直接访问。
使用:
test.js
module.exports = {
a : function(){},
b : 'test'
}
var t = require('./test');
t.a();
AMD与CMD
require在服务端优势明显,因为加载的模块在服务器硬盘上,而在浏览器端确需要等待网络传输,加载完成后才可以使用模块中的对象,这种同步方式不符合js异步的理念,于是就有了AMD与CMD两种异步加载方式。
AMD: Asynchronous Module Definition
CMD: Common Module Definition
AMD是将对依赖加载模块部分都放到异步函数中完成
math.js
define(['Lib'], function(Lib){
function foo(){
Lib.doSomething();
}
return {
foo : foo
};
});
require(['math'], function (math) {
math.add(2, 3);
});
ES6的import
ES6应该也是一种异步加载方式,具体原理没有深入了解
它是通过解构的方式来导入、到处,这样就可以不用引用所有对象。另外有一个default语法糖,每个模块都有只一个default,这样在import时可以不写解构的过程。
与default语法糖相关的是as关键字,像是SQL的as,起一个别名,default就是这个别名。
export还是的到处可以放在每个对象上定义,而不是放在一个exports对象里。
```
export { name1, name2, …, nameN };
export { variable1 as name1, variable2 as name2, …, nameN };
export default expression;
import { member } from "module-name";
import { member as alias } from "module-name";
import defaultMember from "module-name"
```
module 与 namespace
下边先来看看Namespace 与 Modules
原文:namespace
开篇的Note:ES2015开始,internal moludes = namespaces, external modules 是modules
-
namespace
namespace是一个在全局命名空间里的对象而已,只不过这个对象定义在多个文件中,通过使用 --outFile 连接在一起。
-
modules
与namespace一样,mudule也是既可以包括代码跟声明,最大的区别是modules声明了了依赖。
modules依赖与module loader(如 CommonJs/Require.js),使其更适应于大应用,Module提供更好的代码复用、更强的隔离。
编译器会先去找.ts, .tsx然后 .d.ts, 如果都没有,就去找 module声明。
myModules.d.ts
declare module "SomeModule" {
export function fn(): string;
}
myOtherModule.ts
import * as m from "SomeModule
-
socket.io的引入
在index.d.ts中,
先定义了SocketIO对象,它是一个SocketIOStatic的类型
export = SocketIO ,这块就有点费解, 私下任务,可能就是requrie的modules那种形式。
然后再 export as namespace SocketIO,还是不太明了,因为一个变量与一个namespace是重名的,下面也有对 declare namespace SocketIO
最奇怪的是这个index.d.ts中,全是声明,没有一个实现,这中lib如何使用?
引用
彻底搞清楚javascript中的require、import和export
Node中没搞明白require和import,你会被坑的很惨