webpack5, vue3,vue-cli5 使用 prerender-spa-plugin 预渲染

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了webpack5, vue3,vue-cli5 使用 prerender-spa-plugin 预渲染相关的知识,希望对你有一定的参考价值。

参考技术A

环境: webpack5, vue3,vue-cli5
插件: prerender-spa-plugin
报错: [prerender-spa-plugin] Unable to prerender all routes!

  某天,我在愉快地学(摸)习(鱼),突然又双叒叕被抓去铲屎(T_T),要把之前做的一个东西加入SEO。

  然鹅,这个是静态项目,没有跑在node上,也就(没)用(时)不(间)了(改)ssr...
行叭, Prerender 走一个~

  然后...我就收到报错大礼包一份。

  吓得我立马跑去检查配置文件,并自我怀疑:作为一只 CV 攻城狮 ,配置文件这玩意通常都是老项目拉过来的,除了开荒的时候改过,后面基本都不会再动它,应该没什么问题把...
然后发现配置好像确实没什么问题,场面一度十分尴尬。

  好吧,人肉 debug 开始!我熟练地点进 prerender-spa-plugin 里( 熟练到让人心疼 )
一顿搜索 Unable to prerender all routes 出来两个文件调用,分别是 ES5 ES6 的规范,到 index.js 瞄一眼,就能发现 Node.js 版本在 8.0 以上使用 ES6 版。

  戳进去发现,抛出的并不是原始错误,原始错误已经被吃掉了(这...)。

  打个断点,发现是函数 compilerFS.mkdirp 调用出错。

  一键飞过去看看调用的地方,发现 compilerFS 其实就是 compiler.outputFileSystem ,里面确实是没有这个方法,熟悉 Node.js 和 webpakc 的大佬们这时候脸上应该已经露出了和煦的微笑。

  作者很贴心的给了个 mkdirp-promise 的链接,戳进去就能看见这么一句话:

   mkdirp-promise 已经停更3年,并且作者近期发话已经弃用,也用不了了。如果你使用的是最新的 Node.js 那么直接用 fs.mkdir 就行了。
现在,把 node_modules\\prerender-spa-plugin\\es6\\index.js 第 60 行 compilerFS.mkdirp 函数改成 compilerFS.mkdir 。

再来一次~

完结撒花~~~

   compiler.outputFileSystem 其实就是 Node.js 的输出文件系统,调用的是 Node.js 的 fs 模块,
fs.mkdir 这包是给早期 Node.js 递归创建文件夹,并且返回 Promise 用的,现在的 Node.js 早已经支持递归,并且可以返回Promise。所以这个包已经不需要了,直接用 fs.mkdir 就行了。

三点几了!饮茶先啦~~
prerender-spa-plugin-next 的配置先咕了,下次再讲 本萌新先去饮茶啦~

2021.5.17,补充 prerender-spa-plugin-next 配置

如何通过 vue-cli 3 配置 webpack 以使用 sass

【中文标题】如何通过 vue-cli 3 配置 webpack 以使用 sass【英文标题】:How to configure webpack via vue-cli 3 to use sass 【发布时间】:2019-05-13 10:33:15 【问题描述】:

我正在使用 vue-cli 3 构建一个 vue 应用程序。我想在我的 webpack 构建中包含 sass 文件,但 vue-cli 抽象了 webpack.config.js 文件。相反,我们将创建一个vue.config.js 文件并使用一组指令对其进行配置。

如果我正在配置webpack.config.js,以下内容将起作用:

module.exports = 
  module: 
    rules: [
      // ... other rules omitted

      // this will apply to both plain `.scss` files
      // AND `<style lang="scss">` blocks in `.vue` files
      
        test: /\.scss$/,
        use: [
          'vue-style-loader',
          'css-loader',
          'sass-loader'
        ]
      
    ]
  ,
  // plugin omitted

我应该如何配置我的vue.config.js 来达到同样的效果?这是我最好的尝试:

module.exports = 
    chainWebpack: config => 
        config.module
            .rule('scss')
            .test(/\.scss$/)
            .use('vue-style-loader')
            .loader('vue-style-loader')
            .use('css-loader')
            .loader('css-loader')
            .use('sass-loader')
            .loader('sass-loader')
            .end();
    
;

这会失败并显示消息

ERROR  TypeError: config.module.rule(...).test(...).use(...).loader(...).use is not a function

【问题讨论】:

你检查了吗:***.com/questions/44019469/…,我们也有 sass,我们在 vue.config.js 中没有具体说明,你总是可以运行 vue inspect --mode production > production.config .js 来查看 vue-cli 在 npm run build 上使用的 webpack 配置,或者 vue inspect --mode development > development.config.js 来查看 vue-cli 在 npm run serve 上使用的 webpack 配置,如果你改变了那个 vue。配置文件,然后再次运行它们,您可以看到您的更改 【参考方案1】:

如果您使用的是 vue cli 3,那么只需在您的项目根目录中运行以下命令:

vue add style-resources-loader

【讨论】:

以上是关于webpack5, vue3,vue-cli5 使用 prerender-spa-plugin 预渲染的主要内容,如果未能解决你的问题,请参考以下文章

webpack5项目搭建Vue-Cli(开发模式)

webpack5项目搭建Vue-Cli(生产环境)

webpack5项目搭建Vue-Cli(配置优化)

webpack5项目搭建Vue-Cli(合并配置)

vue-cli + vue3 + echarts5

ScriptExternalLoadError:加载脚本失败。 vue-cli@5.0.0-rc.0