vue ssr css内联样式和link标签重复

发布于 2022-09-11 20:36:23 字数 2999 浏览 20 评论 0

我把基于vue-cli3的项目改造成了SSR,发现服务器吐出的html中内联了css,同时还会注入css的link标签,这样造成了css的重复引入。

我不想在html中注入内联的style,我想全部使用link标签,对于不经常变化的css这样能更好的利用缓存,该如何做?

以下是vue.config.js

const WebpackBar = require('webpackbar');
const nodeExternals = require('webpack-node-externals');
const VueSSRServerPlugin = require('vue-server-renderer/server-plugin');
const VueSSRClientPlugin = require('vue-server-renderer/client-plugin');

const IS_PROD = process.env.NODE_ENV === 'production';
// 用于标记是否是SSR构建
const IS_SSR = process.env.RUN_MODE === 'ssr';
// 用于区分SSR的client和server构建
const { SSR_SIDE } = process.env;
const IS_SSR_SERVER = SSR_SIDE === 'server';

module.exports = {
  productionSourceMap: false,

  css: {
    extract: IS_PROD && (!IS_SSR || !IS_SSR_SERVER),
  },

  chainWebpack(config) {
    // 默认入口
    config
      .entry('app')
      .clear()
      .add('./src/entry-client.js')
      .end();

    if (!IS_SSR || !['server', 'client'].includes(SSR_SIDE)) return;

    // ssr入口
    config
      .entry('app')
      .clear()
      .add(`./src/entry-${SSR_SIDE}.js`)
      .end();

    // loader
    config
      .module
      .rule('vue')
      .use('vue-loader')
      .tap((options) => {
        if (IS_SSR_SERVER) {
          options.cacheIdentifier += '-server';
          options.cacheDirectory += '-server';
        }
        options.optimizeSSR = IS_SSR_SERVER;
        options.extractCSS = IS_PROD;

        return options;
      })
      .end()
      .use('cache-loader')
      .tap((options) => {
        if (IS_SSR_SERVER) {
          options.cacheIdentifier += '-server';
          options.cacheDirectory += '-server';
        }
        return options;
      });

    // plugin
    config
      .plugin('vue-ssr')
      .use(IS_SSR_SERVER ? VueSSRServerPlugin : VueSSRClientPlugin)
      .end()
      .plugin('loader')
      .use(WebpackBar, [{
        name: IS_SSR_SERVER ? 'Build server' : 'Build client',
        color: IS_SSR_SERVER ? 'blue' : 'green',
      }])
      .end();

    // 移除不必要的plugin
    config
      .plugins
      .delete('hmr')
      .delete('preload')
      .delete('prefetch')
      .delete('progress');

    config
      .target(IS_SSR_SERVER ? 'node' : 'web');

    if (IS_SSR_SERVER) {
      config
        .devtool('source-map')
        .node
        .clear()
        .end()
        .output
        .libraryTarget('commonjs2')
        .end()
        .externals(nodeExternals({ whitelist: [/\.css$/, /\?vue&type=style/] }))
        .optimization
        .splitChunks(false);
    }
  },
};

通过以上的ssr配置,吐出的html如下:
图片描述

其中,内联的style/css/app.84e85091.css/css/home.fb83d978.css内容重复
图片描述

项目地址:https://github.com/Zousdie/crazy-vue-ssr

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

红玫瑰 2022-09-18 20:36:23

如果有人需要解决这个问题,可以看一下我的这个方法https://www.jianshu.com/p/2ea74be53425

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文