如何初始化共享 javascript 模块默认导出

2024-02-29

我想在多个模块之间共享一个 api 实例,并能够使用外部配置对其进行初始化。我的代码使用 Webpack 和 Babel 将这些漂亮的 ES6 模块转换为浏览器可用的东西。我正在努力实现这一目标:

// api.js
let api = null;
export default api;
export function initApi(config) {
  // use config to configure the shared api instance (e.g. with api base url)
  api = ...
}


// ======================
// entry.js
import { initApi } from './api';
import App from './App';

// Initialize the single shared instance before anyone has the chance to use it
const apiConfig = ...
initApi(apiConfig);

// Create the app and run it


// ======================
// App.js
// RootComponent has an import dependency chain that eventually imports DeeplyNestedComponent.js
import RootComponent from './RootComponent';

// Actual App code not important


// ======================
// DeeplyNestedComponent.js
// PROBLEM! This "assignment" to the api var happens before initApi is run!
import api from '../../../../api';

api.getUser(123); // Fails because "api" stays null forever even after the initApi() call

出现“问题”是因为 ES6 模块是静态导入的,并且 import 语句是提升的。换句话说,只需移动import App from './App'下面一行initApi(apiConfig)不会使导入发生在initApi叫做。

解决这个问题的一种方法是从api.js(或者在另一个globals.js文件(如果我有多个具有相同模式的此类共享对象)而不是像这样的单个变量:

// api.js
const api = {
  api: null,
};
export default api;
export function initApi(config) {
  // use config to configure the shared api instance (e.g. with api base url)
  api.api = ... // <-- Notice the "api." notation
}


// ======================
// DeeplyNestedComponent.js
// api is now the object with an empty "api" property that will be created when initApi() is called
import api from '../../../../api';

api.api.getUser(123); // <-- Ugh :(

使用ES6模块时有没有办法优雅地实现共享服务实例的初始化?

就我而言,DeeplyNestedComponent.js还必须importapi 实例以某种方式。换句话说,不幸的是没有上下文对象从App一直到DeeplyNestedComponent.js可以提供 api 实例的访问权限。


你的代码的问题是

let api = null;
export default api;

是否导出value null在默认导出的隐式生成的绑定中。但是,您也可以导出名称下的任意绑定default通过使用语法

let api = null;
export { api as default };

这将按预期工作。但您仍然需要确保在调用之前没有模块访问此导出initApi.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何初始化共享 javascript 模块默认导出 的相关文章

  • 使用 Google 地图对 geoJson 文件中的点进行自定义标记

    我使用 GeoJSON 作为 Google 地图的数据源 我使用 API v3 创建数据层 如下所示
  • AJAX 加载 WordPress 内容

    我一直在遵循 AJAX 教程来尝试将我的 WordPress 帖子内容加载到我网站的主页上 而无需重新加载页面 我不知道为什么 但是当单击链接时 它仍然导航到页面 而不是将内容加载到我指定的 div 中 不管怎样 这对我来说有点太多了 我希
  • 为什么 DropDownList.SelectedIndexChanged 事件不触发?

    我有一个绑定到 ObjectDataSource 的 DropDown 在其数据绑定事件中 我在 0 索引上添加 select 值 我在页面上有一个 LinkBut ton 在其客户端单击时 我在下拉列表中选择不同的项目 使用 JavaSc
  • npm 命令不显示任何输出或结果

    npm v 没有给出任何输出 https i stack imgur com 1Z5yf png 请参阅附图 我已经安装了node js 打开我的 git bash 后 如果我运行 node v 它会给我节点版本 但是在我写 npm v 后
  • 使用 Mongodb 和 Node.js 在一个页面中处理多个表单

    我的登录和注册表单都在同一页面上 我已经指定了两种不同的路由来发布数据 但是当我点击注册表单末尾的注册按钮时 它会保存登录表单输入 没有 我看了这个问题 多种表单 一张处理页面 https stackoverflow com questio
  • 如何在 JavaScript 中通过方括号访问私有字段

    这段代码的工作原理 class Test field get field return this field 但如果我想计算字段名称我必须使用方括号 但它不起作用 class Test field get field return this
  • 如何在rails 6 webpacker中添加jquery第三方插件

    我知道它很简单 但是随着 Rails 6 的更新 rails 6 中有新的语法用于管理由 webpacker 维护的 javascript 资源 application js require rails ujs start require
  • 释放 Javascript 中未附加 DOM 节点使用的内存

    作为我的应用程序的一部分 我将一组小型 Dom 节点放在一起 这些节点不会一次全部显示 我将它们存储在内部数组中 用户可以调用它们的显示 在这种情况下 我将它们重新设置为用于显示它们的 div 这一切都很好 但是 当需要用新的替换所有它们时
  • 如果未登录则重定向 html 页面

    我的网页上有简单的登录表单 它使用 javascript 来登录用户并且工作正常 问题是 用户直接在地址栏中输入登陆页面 URL 他无需登录即可直接访问该页面 如果他没有登录 我想将他重定向到登录页面 以下是loding和目标页面的链接 l
  • 如何在 PhantomJS 中使用 JavaScript 检测网页上的声音?

    我需要检测带有横幅的网页中的所有声音 我怎样才能做到这一点 我查看 PhantomJS 但找不到浏览器声音的 API PhantomJS 1 x 和 2 不支持 Flash
  • Twitter Bootstrap 2 模式表单对话框

    我有以下对话框 div class modal div class modal header a class close a h3 Add Tags h3 div div class modal body div div
  • 在 Three.js 中获取 Object3D 的大小

    我的场景中有这个 3D 对象 var icon new THREE Object3D var iconTexture THREE ImageUtils loadTexture images icon png iconMaterial new
  • 错误:找不到模块“@discordjs/opus”

    每次我运行不和谐的语音识别代码时 它都会上线 但一旦加入频道 我的代码就会显示错误 找不到模块 discordjs opus Require stack C Users SURYASH Desktop DiscordSpeechBot no
  • jquery 是否有 .toggle() 的替代方案[重复]

    这个问题在这里已经有答案了 目前根据 Jquerysite http api jquery com category deprecated deprecated 1 8 toggle 在 1 8 版本后已被弃用 那么有没有 toggle 的
  • 从 select2 选定选项获取属性值

    我正在使用 Select2 插件http ivaynberg github io select2 select2 latest html http ivaynberg github io select2 select2 latest htm
  • 如何使我的滚动到顶部按钮动画流畅

    我的页面上有一个滚动到顶部按钮 但是当我单击它时 它不会滚动到顶部 它只是直接带我到顶部 就像我加载了一个新页面一样 但我需要的是滚动动画 javascript window onscroll function scrollFunction
  • Phonegap - 自动包含正确的科尔多瓦

    我正在 iOS 和 Android 上开发一个 PhoneGap 应用程序 并使用 git 控制我的 www 目录版本 我知道我的 HTML 文件需要包含正确的 Cordova js 文件 取决于我当前正在开发的平台 当有人在 Androi
  • Google Map API V3 - 单击标记以叠加形式显示更多信息内容(如 Google 地图中一样)

    我们使用 Google Map Api V3 在 HTML 容器中加载 google 地图 我们有一个位置搜索表格 提交后 我们将获取可用位置并在地图中设置标记 加载标记后 单击每个标记时我们需要显示标题 地址详细信息和设计 就像我们在谷歌
  • Javascript增加最大数组大小[重复]

    这个问题在这里已经有答案了 我正在尝试创建一个大小的数组2 32 4294967296 因为我试图通过运行筛算法来获取 2 32 之前的所有素数 但是 该数组中的任何操作都会出现以下错误 致命错误 CALL AND RETRY LAST 分
  • 使用概率选择数组值

    我还有一个作业要做 那就是 从黄色 蓝色和红色中随机选择一种颜色 概率为 黄色 3 7 蓝色 1 7 红色 3 7 我知道我可以通过使用类似的方法来解决这个问题 黄黄黄蓝红红红 但我认为这在编程上不是很好 因为当我碰巧发生这种情况时 我将不

随机推荐