2017-06-13 74 views
0

我目前正在研究由SonarQube为Node.js应用程序标识的技术债务。我的应用程序允许在实时和模拟数据源之间进行即时切换。为了达到这个目的,我从缓存中销毁了前面的“require”并重新使用它。运行SonarQube时,它不喜欢“require”语句。它的确提出了“进口”声明。但是,在这种情况下可能不适合。重新包含模块

的现有代码简化版本:

var config = require('../config'); 
var polService = require(config.polService); 
var root = require('../root'); 
function doingStuff(liveOrMock) { 
    setEnvironment(liveOrMock); 
    delete require.cache[require.resolve(root.path + ‘/config’)]; 
    config = require('../config'); 
    polService = require(config.polService); 
} 

setEnvironment函数设置process.env.NODE_ENV = liveOrMock,其在config.js使用。我们使用module.exports = localOptions[process.env.NODE_ENV];导出config模块此代​​码从JSON中选择一个密钥对。返回的值用于选择哪个模块用于restService。

能够改变正在使用的模块是polService是代码的目的。

+0

是的,它看起来像ES6模块不适合在这里。他们不允许这样搞乱。 – Bergi

回答

1

更改您的config模块以导出函数,然后在需要更改环境时调用此函数。

为了使polService成为动态模块,您可以使用dynamic import()。本地不支持import(),但可以使用this Babel plugin(它与webpack一起使用)来转译它。

config.js

export default() => { 
    // ... 
    return localOptions[process.env.NODE_ENV]; 
} 

主要模块:

import getConfig from '../config'; 

let config = getConfig(); 

function doingStuff(liveOrMock) { 
    setEnvironment(liveOrMock); 
    config = getConfig(); 
    return import(config.polService).then(result => { 
    polService = result; 
    }); 
} 

请记住,现在doingStuff功能是异步的(即返回一个承诺),所以你不能仅仅把它和访问polService立即。您必须通过使用then()方法或在async function中使用await来等待它。

如果您的polService模块数量有限,则最好先导入所有模块,doingStuff函数只需切换polService变量所引用的模块。

import getConfig from '../config'; 
import polService1 from '../polService1'; 
import polService2 from '../polService2'; 
import polService3 from '../polService3'; 

const polServices = { polService1, polService2, polService3 }; 

let config = getConfig(); 
let polService = polService1; 

function doingStuff(liveOrMock) { 
    setEnvironment(liveOrMock); 
    config = getConfig(); 
    polService = polServices[config.polService]; 
}