6

一般设置

我正在基于这个很棒的样板 构建一个带有webpackpug的小型网站: https ://github.com/alexnoz/webpack-pug-scss-boilerplate.git

该项目已启动并正在运行,我能够正确呈现 pug 文件。

要求

现在我需要在所有 webpack 编译发生之前加载一些数据。我想将该数据传递给 pug-html-loader,如已回答的问题中所述。

问题/问题

我的问题是,我必须异步加载该数据。所以我所拥有的是一个Promise。如何确保在webpack 编译发生之前完成承诺?

这是我目前行不通的方法

// in webpack.config.js

var myData = []
loadSomeDataAsync().then(loadedData => myData = loadedData)

{
  loader: 'pug-html-loader',
  options: {
    data: myData    // <==== 
  }
}

pug-html-loader接受options.data如果我把静态数据放在那里,那么这个数据在哈巴狗模板中可用。

我知道我的问题似乎是,在 webpack 编译发生之前,我的 Promise 尚未解决。但是如何让 webpack 以某种方式“等待” Promise 解决呢?

我已经尝试注册 webpack 事件挂钩。但没有成功。有什么进一步的建议吗?

4

2 回答 2

3

这种情况的默认模式如下所示:

const configPromise = new Promise(function(resolve, reject) {
  setTimeout(() => { resolve(webpackConfig) }, 1000);
});

configPromise
  .then(webpack) // Passes the config to webpack
  .then(compiler => {
    // Do the work with the compiler
  });

该功能在DOCS中有详细记录。

Webpack 将运行配置文件导出的函数并等待返回一个 Promise。当您需要异步加载配置变量时很方便

module.exports = () => {
  return new Promise((resolve, reject) => { // The promise could be an XHR call using fetch, Axios or whatever
    setTimeout(() => { 
      resolve({ // Resolve webpack config
        entry: './app.js',
        /* ... */
      });
    }, 5000);
  });
};
于 2019-09-30T12:27:19.750 回答
1

就如此容易:

module.exports = () => {
  return loadSomeDataAsync().then(function(loadedData) {

        return {
          entry:  './app.js',
          ...
          options {
            data: loadedData
          }
          ...
        }
  });
};

请注意,文档中的 setTimeout() 用于说明目的(模拟获取数据时的延迟)。

它是如何等待的?在内部,他们必须使用 async + await。

例如,为了帮助您更好地理解,请查看以下代码(再次,出于说明目的):

function simulateLoadData() { 
  return new Promise(resolve => {
    setTimeout(() => {
      resolve("data"); // once I get the data, I pass it through resolve
    }, 2000); // just for illustration purposes and simulate query to remote machine
  });
}

function getConfig() {
  return simulateLoadData().then(function(dataLoaded){ // here I retrieve the data resolved
    return { data: dataLoaded }; // I can pass dataLoaded to my config
  });
}

async function app() {
    var config = await getConfig(); // here is where I retrieve the returned config
    console.log("config", config); // config > Object { data: "data" } 
}

app();

于 2019-09-30T13:25:32.250 回答