需要、导入、默认导出、具名导出

由于氛围而写成的研究

需要

这是由CommonJs制定的规范。
CommonJs是一个主要关注于NodeJs(浏览器之外的Js)模块系统标准化的项目。
确实,在前端的Js中,我很少看到有require的情况。

用法

有两种选择

module.exports(默认导出)

・在 require 的一方面,可以用任何名称来加载
・module.exports 本身可以在同一个文件中定义多个,但是只有最后一个条目生效

module.exports = (a, b) => a - b;
module.exports = (a, b) => a + b; // これが有効
const add = require('add.js');
console.log(add(1, 2)); // → 3

导出(具名导出)

可以强制要求需要`require`的一方提供名称。
在同一个文件中,可以使用不同的名称对外输出,从而允许多个定义。

exports.add = (a, b) => a - b;
exports.devide = (a, b) => a / b;
const calc = require('calc.js');
console.log(calc.add(1, 2)); // addという名前が強制される
console.log(calc.devide(10, 2)); // devideという名前が強制される

也可以部分地进行require,如下所示。

const { add } = require('calc.js');
console.log(add(1, 2));

const { add: a } = require('calc.js'); // ちなみにこうすることでaという名前で読み込める

导入

ESModule是在ECMAScript中制定的规范。
ECMAScript是浏览器上运行的Javascript规范的标准化项目。
每个浏览器都会实现符合ECMAScript规范的Javascript。
(我不太自信…如果有错误,请指正)

然而,ESModule自身在最近的NodeJS中得到了支持。

默认导出

・对应于CommonJS的module.exports的选项
・在一个文件中只能定义一个的选项

export default (a, b) => a + b;
import add from './add';
console.log(add(1, 2)); // → 3

也可以按照以下方式进行导入

import * as add from './add';
console.log(add.default(1, 2)); // → 3

导出(具名导出)

对应CommonJS的exports

export const add = (a, b) => a + b;
export const devide = (a, b) => a / b;

也可以用如下方式编写。

const add = (a, b) => a + b;
const devide = (a, b) => a / b;

export { add, devide };
import { add, devide } from './calc';

add(1, 2);
devide(10, 2);

也可以按照以下方式进行。

import * as calc from './calc';
calc.add(1, 2);

calc.devide(10, 2);

CommonJs和ESModule之间的比较。

由于NodeJs支持ESModule,所以我想现在可以完全使用ESModule了吧?但目前看来,将两者全都转为ESModule似乎有些困难。
由于还没有仔细调查过,所以我会另外总结一下。。。

默认导出 vs. 命名导出

这个是指定导出的选项对吧?我以为只有使用默认导出的人,但似乎在业界还有一些喜欢使用命名导出的人…我也会另外调查一下这个问题。

最后,我确认了一下我的Express(Typescript)代码只是用ESModule写的,然后发现转译后的JS变成了CommonJS的格式(真是令人惊讶)据说还需要做一些工作才能在整个NodeJS项目中应用ESModule。我希望能探讨一下这方面的问题。

广告
将在 10 秒后关闭
bannerAds