Правильный способ экспорта объекта в модуль es6
Я пытаюсь экспортировать мой модуль как объект, но экспорт выглядит как "антишаблон" ( https://medium.com/@rauschma/note-that-default-exporting-objects-is-usually-an-anti-pattern-if-you-want-to-export-the-cf674423ac38)
Поэтому мне было интересно, как правильно экспортировать объект, а затем использовать его как
import utils from "./utils"
`
utils.foo()
В настоящее время я делаю так
/** a.js **/
function foo(){
//...
}
export {
foo
}
/** b.js **/
import * as utils from "a";
utils.foo()
это правильно так? Поддерживаю ли я функцию встряхивания деревьев?
Спасибо
2 ответа
Если объект, который вы хотите импортировать / экспортировать, содержит только некоторые функции (как я полагаю, из-за Utils
имя), вы можете экспортировать функции отдельно следующим образом:
export function doStuff1() {}
export function doStuff1() {}
И импортировать так:
import {doStuff1, doStuff2} from "./myModule";
Однако, если объект, который вы хотите экспортировать, содержит состояние в дополнение к методам, вам следует придерживаться простого export default myObject
, В противном случае вызов импортированных методов не будет работать должным образом, так как контекст объекта потерян.
Например, следующий объект должен быть экспортирован целиком, так как свойства объекта должны оставаться инкапсулированными. Только импорт и вызов increment
функция не будет мутировать myObject
поскольку контекст объекта не может быть предоставлен (так как он не импортирован целиком).
const myObject = {
counter: 0,
increment: function() {
this.counter++;
}
}
export default myObject;
ES6 родной способ сделать это:
// file1.es6
export const myFunc = (param) => {
doStuff(param)
}
export const otherFunc = ({ param = {} }) => {
doSomething({ ...param })
}
// file2.es6
import { otherFunc } from './file1.es6'
import * as MyLib from './file1.es6'
MyLib.myfunc(0)
MyLib.otherFunc({ who: 'Repley' })
otherFunc({ var1: { a1: 1 } })
И так далее.