javascript - 如何优雅地处理自定义 Webpack 插件中的错误?
问题描述
有没有人有关于如何在自定义 Webpack 插件中正确处理错误的提示或信息?
我正在尝试编写一个使用 axios 获取外部数据的插件,然后将其写入 json 文件以供以后在应用程序中使用。到目前为止,这工作正常,但是如果由于某种原因 axios 调用失败,它会导致整个 Webpack 构建崩溃。我不希望 Webpack 构建依赖于这个外部 API 调用,如果它失败了,就跳过这个过程并继续构建。
我曾假设我可以将调用包装在 try-catch 块中,然后通过调用 callback() 函数继续构建,但 Webpack 似乎首先拦截了错误并停止构建。
这是插件代码:
const fs = require('fs');
const path = require('path');
const axios = require('axios');
const url = `https://company.cdn.prismic.io/api/v2/documents/search?ref=YYK3AhAAACEAyRmF&q=[[not(my.blog.unlisted,true)]]&q=[[at(document.type,"blog")]]&orderings=[my.blog.publish_date desc]&pageSize=3`;
const sourceDataFromService = (
{ alreadyGenerateContent, onComplete, logger },
callback
) => {
if (!alreadyGenerateContent) {
logger.info('======== GETTING PRISMIC DATA ========');
const getPrismicData = async () => {
// Grab data from prismic
const response = await axios.get(url);
logger.info('Blog Data received');
const { results } = response.data;
const blogPosts = [];
results.forEach((result) => {
blogPosts.push({
title: result.data.title,
author: result.data.author,
publishDate: result.last_publication_date,
slug: result.uid
});
});
// Write to prismic.json
fs.writeFile(
path.resolve(__dirname, './src/prismic.json'),
JSON.stringify(blogPosts),
() => {
logger.info('Blog Data written to prismic.json');
callback();
}
);
};
try {
// Make call to Prismic
getPrismicData();
} catch (error) {
logger.error(error);
callback();
}
onComplete();
} else {
callback();
}
};
class PrismicDataPlugin {
constructor() {
this.alreadyGenerateContent = false;
}
apply(compiler) {
compiler.hooks.beforeCompile.tapAsync(
'PrismicDataPlugin',
(compilation, callback) => {
const logger = compilation.getLogger
? compilation.getLogger('PrismicDataPlugin')
: console;
sourceDataFromService(
{
alreadyGenerateContent: this.alreadyGenerateContent,
onComplete: () => {
this.alreadyGenerateContent = true;
},
logger
},
callback
);
}
);
}
}
module.exports = PrismicDataPlugin;
它在 webpack.config.js 文件中配置如下:
const PrismicDataPlugin = require('./PrismicDataPlugin');
...
plugins: [
new webpack.DefinePlugin({
'process.env': {
APP_MODE: JSON.stringify(env.appMode)
}
}),
new HtmlWebpackPlugin({
template: 'src/index.html'
}),
new PrismicDataPlugin()
],
...
任何提示将不胜感激!
解决方案
推荐阅读
- wso2 - WSO2 身份服务器 - 根据用户角色限制服务提供商的入站身份验证
- react-native - React Native如何计算文本的字符长度?
- java - 将 int 转换为双 java
- amazon-web-services - Lambda@edge 记录发布请求 ID 但不发布控制台日志
- react-native - @react-native-community/picker 抛出注册两个同名视图的错误
- r - lubridate 解析具有多种格式的日期列并默认为月份的最后一天
- python - 就 n 和 m 而言,运行时复杂度是多少?
- python - 将 CRC16 CCITT 代码从 C 转换为 Python
- python - 如何使用 KNN 结果快速创建图(ImageNet)
- powershell - 在 PowerShell 中正确拆分所选数据和格式