我目前正在使用Babel.
之前我做过以下事情require
:
try {
var myModule = require('my-module');
} catch (err) {
// send error to log file
}
Run Code Online (Sandbox Code Playgroud)
但是当试图这样做时import
:
try {
import myModule from 'my-module';
} catch (err) {
// send error to log file
}
Run Code Online (Sandbox Code Playgroud)
我收到错误:
'import'和'export'可能只出现在顶层
现在我明白这import
是不同的require
.从阅读是否提升ES6模块进口? import
提升,这意味着在代码执行之前加载了导入.
我之前做的是,如果有任何要求失败,则会创建一个日志,通过电子邮件提醒我(将日志发送到logstash等).所以我的问题归结为以下几点.
如何在nodejs中以良好的实践方式处理导入错误?这样的事情存在吗?
Cav*_*man 16
您无法捕获静态导入错误(参见鲍里斯的回答)
但是,您可以import()
为此使用动态。
它现在被所有常绿浏览器和 Node 支持,并且是自 ES2020 以来标准的一部分。
class ImportError extends Error {}
const loadModule = async (modulePath) => {
try {
return await import(modulePath)
} catch (e) {
throw new ImportError(`Unable to import module ${modulePath}`)
}
}
Run Code Online (Sandbox Code Playgroud)
补充动态导入。
class ImportError extends Error {}
const loadModule = async (modulePath) => {
try {
return await import(modulePath)
} catch (e) {
throw new ImportError(`Unable to import module ${modulePath}`)
}
}
async function main() {
// import myDefault, {foo, bar} from '/modules/my-module.js'
const { default: myDefault, foo, bar } = await loadModule('/modules/my-module.js')
}
Run Code Online (Sandbox Code Playgroud)
或链式承诺
import("/modules/my-module.js").then(module=>{
module.foo()
module.bar()
}).catch(err=>
console.log(err.message)
)
Run Code Online (Sandbox Code Playgroud)
或解构赋值
import("/modules/my-module.js").then(({foo, bar})=>{
foo()
bar()
}).catch(err=>
console.log(err.message)
)
Run Code Online (Sandbox Code Playgroud)
这个演讲给出了它:https://github.com/ModuleLoader/es-module-loader/issues/280并同意你所说的.
导入仅适用于基础级别.它们是静态的,并且在模块运行之前始终加载.
所以你不能做代码检查.
但是,好消息是,由于它是静态的,可以进行分析,像webpack这样的工具会在构建时抛出错误.
归档时间: |
|
查看次数: |
6829 次 |
最近记录: |