从 ES6 模块导出单例 class 的优缺点
Pros and cons of exporting a singleton class from an ES6 module
我目前正在开发一个基于 node.js 和 Babel 的项目。
我有一个 userService.js 文件,它应该是一个单例文件,可以管理我想要与用户一起使用的所有内容,并保持用户的状态。
为什么要这样写这个模块:
class UserService { //methods //properties}
export default new UserService(); //so it is a singleton
并以这种方式导入:
import userService from 'userService';
而不是这样:
export function login() {} //other functions etc
export var user={}
并像这样导入:
import * as userService from 'userService
';
仅仅是风格上的区别吗?
我明白了,例如只导入没有注销方法的登录是没有意义的,所以用所有方法导出 class 听起来不错,但另一种方法的优点是不必使用 "this"一直是关键字。
您可能希望将一组方法分组到一个文件中,但不一定要始终一起导入。例如,一个实用程序 class 可能会列出许多您希望根据需要一次导入一个的函数。
导出一个default
,无论是class封装还是单个函数,都清楚了那个模块的主要意图是什么。您还可以组合默认导出和命名导出:
// user.js
export default class User {}
export function getUserInfo()
// ... other file ...
import User, {getUserInfo} from 'user.js'
const user = new User();
getUserInfo(user);
最终这取决于你如何expect/want使用你的模块。
我目前正在开发一个基于 node.js 和 Babel 的项目。
我有一个 userService.js 文件,它应该是一个单例文件,可以管理我想要与用户一起使用的所有内容,并保持用户的状态。
为什么要这样写这个模块:
class UserService { //methods //properties}
export default new UserService(); //so it is a singleton
并以这种方式导入:
import userService from 'userService';
而不是这样:
export function login() {} //other functions etc
export var user={}
并像这样导入:
import * as userService from 'userService
';
仅仅是风格上的区别吗?
我明白了,例如只导入没有注销方法的登录是没有意义的,所以用所有方法导出 class 听起来不错,但另一种方法的优点是不必使用 "this"一直是关键字。
您可能希望将一组方法分组到一个文件中,但不一定要始终一起导入。例如,一个实用程序 class 可能会列出许多您希望根据需要一次导入一个的函数。
导出一个default
,无论是class封装还是单个函数,都清楚了那个模块的主要意图是什么。您还可以组合默认导出和命名导出:
// user.js
export default class User {}
export function getUserInfo()
// ... other file ...
import User, {getUserInfo} from 'user.js'
const user = new User();
getUserInfo(user);
最终这取决于你如何expect/want使用你的模块。