Я пытаюсь экспортировать мой модуль в качестве объекта, но экспорт выглядит как "анти-шаблон" (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()
Правильно ли это так? Поддерживаю ли я древовидную функцию?
Спасибо
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 } })
И так далее.
Если объект, который вы хотите импортировать/экспортировать, содержит только некоторые функции (как я полагаю, из-за имени 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;