Javascript
export-default

[js] export { default }

zustand 的 source code 中可以看到

export * from "./vanilla";
export * from "./react";
export { default as createStore } from "./vanilla";
export { default } from "./react";
 
// 現在剩下
// 不過這不是重點
export * from "./vanilla";
export * from "./react";
export { default } from "./react";

首先

export { default as createStore } from "./vanilla";

從 vanilla 這個檔案拿他的 default export,然後用 createStore 這個名稱 export。

export { default } from "./react";

從 react 這個檔案拿他的 default export,然後以 default export。

named export and default export

ES6 有分為 named export 跟 default export,上面的export * from "./vanilla"是把 vanilla 中的 named export 在 index.ts 底下再 export 一次。

不過最後一行的export { default } from "./react"其實也已經 deprecated 啦。

所以現在用到 create 時我們會用import { create } from "zustand"

/**
 * @deprecated Use `import { create } from 'zustand'`
 */
export default ((createState: any) => {
  if (__DEV__) {
    console.warn(
      "[DEPRECATED] default export is deprecated, instead import { create } from'zustand'"
    );
  }
  return create(createState);
}) as Create;

那第三行的export { default as createStore } from "./vanilla",去翻當時的檔案,可以看見 vanilla.ts 中

const createStore = ((createState) =>
  createState ? createStoreImpl(createState) : createStoreImpl) as CreateStore;
 
export default createStore;

我們就是把這個 default export 在 index 中重新以 createStore 的名稱 export。(named export)

所以我們可以直接從 zustand(index.ts)這樣叫 createStore

import { createStore } from "zustand";

這些平常可能不會特別注意到,因為從 documeny 複製貼上時不會想那麼多對吧。