ES6 运行时交换模块

Ray*_*oss 1 javascript node.js ecmascript-6

我有 api.js,它加载mock.js 或server.js 并将其导出。结果是,根据服务器环境变量,我可以在后端之间交换。

问题是,我想在运行时执行此操作,而不影响已经使用mock.js 和 server.js 模块的“api”的所有代码。

我希望我的应用程序根据连接状态使用mock.js 或server.js。以下代码仅在初始化期间起作用,而不是在运行时起作用。

import server from './server'
import mock from './mock'

let backend = null
if (process.env.NODE_ENV === 'development' && Math.random() > 0.5 ) {
  backend = mock
} else {
  backend = server
}

export default backend
Run Code Online (Sandbox Code Playgroud)

log*_*yth 5

如果需要,您可以利用 ES6 实时绑定,例如

import server from './server';
import mock from './mock';

export { backend as default };

let backend = server;

setInterval(() => {
    backend = Math.random() > 0.5 ? mock : server;
}, 1000);
Run Code Online (Sandbox Code Playgroud)

这将每秒随机更改默认导出。

在 ES6 中,导入的变量是对导出值的模块中变量的实时引用,因此您可以

import backend from "./api";
Run Code Online (Sandbox Code Playgroud)

并且该backend值会随着时间而变化。

特别是在你的情况下,改变

export default backend;
Run Code Online (Sandbox Code Playgroud)

export { backend as default};
Run Code Online (Sandbox Code Playgroud)

至关重要,因为第一个不起作用,因为它是缩写

const uniqueTempVal = backend;
export { uniqueTempVal as default };
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,这意味着backend稍后重新分配不会影响导出的值。