0

我有一个相当复杂的 web 应用程序,用 React/Redux 和 webpack 编写,用于编译。它的登陆页面由 2 张图片和主应用程序模块组成。所有其他模块都是延迟加载的,具体取决于用户想要做什么。当我使用 google devtools 进行审计时,我得到了 74 的性能分数,这还不错。

但在 iphone 上,初始页面加载时间超过 15 秒!我需要优化它。

图片 其中一张图片是 html body 的背景,以便在其他页面加载时显示。另一个是主页组件的背景。主页图像是不可协商的,它必须在那里。身体中的那个我更灵活,但看起来很酷。

现在主页图像使用 webpack url-loader 导入到 react 组件中,因此在应用程序包中。这是最好的方法吗?另一张图片直接加载到 body 元素上的 index.html 中。我不确定哪个是最快的方法。

我也不是图像专家,所以也许我还能做些什么来压缩或优化图像?是否有跨平台使用的“最佳尺寸”?还有用什么工具来改变?我的系统上有 GIMP,但可以使用其他东西。

Splash 如果用户在加载时看到“某些东西”,那就太好了,这样他们就可以更有耐心了。现在他们只看到一个空白的白色屏幕。我已经关注了所有的网站图标生成器,并根据指示进行了所有设置。但飞溅没有显示。有什么我可以在那里做的吗?我什至尝试在 HTML 中更改不同颜色的背景,但这也没有显示出来。

CSS 为了组织我的项目代码,我构建了非常组件化的所有内容。我的样式表大多位于每个组件旁边,并被导入到使用它的地方。这些也由 webpack 使用 miniCssExtractLoader 和 css-loader 捆绑。我附上了我的 webpack 配置——我可以在那里做些什么吗?

Webpack 我还能做些什么来缩短初始加载时间?这是我的 webpack.common 和 webpack.prod 设置。任何想法将不胜感激!

webpack.common.js

const path = require('path');
var webpack = require('webpack');
const CleanWebpackPlugin = require('clean-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const sourcePath = path.join(__dirname, './src');
const autoprefixer = require('autoprefixer');
const CopyWebpackPlugin = require('copy-webpack-plugin');


module.exports = {
  entry: {
      app: './src/index.js'
  },
  output: {
      filename: '[name].[chunkhash:4].js',
      chunkFilename: '[name].[chunkhash:4].js', //name of non-entry chunk files
      path: path.resolve(__dirname, 'dist'),  //where to put the bundles
      publicPath: "/" // This is used to generate URLs to e.g. images
    },
  module: {
      rules: [
        {
          test: /\.(js|jsx)$/,
          exclude: /node_modules/,
          use: {
            loader: "babel-loader"
          }
        },
        {
          test: /\.html$/,
          use: [
            {
              loader: "html-loader",
              options: { minimize: true }
            }
          ]
        },

        {
          test: /\.(scss|sass|css)$/,
          use: [
              MiniCssExtractPlugin.loader,
              { loader: 'css-loader' },
              { loader: 'postcss-loader',
                  options: {
                    plugins: () => [autoprefixer({ grid: false})]
                  }
              },
              {
                loader: 'fast-sass-loader',
                options: {
                  includePaths: [  path.resolve(__dirname, 'src'), path.resolve(__dirname, 'src','styles') ,'./node_modules', '/node_modules/materialize-css/sass/components'],
                  sourceMap: true
                }
              }
          ]

        },
        {
          test: /\.(jpg|png)$/,
          loader: 'url-loader',
          options: {
            limit: 8192 // inline base64 URLs for <=8k images, direct URLs for the rest
          },
        },
        {    
          test: /\.svg/,
          use: {
            loader: 'svg-url-loader',
            options: {}
          }
        }

      ]
    },

    resolve: {
      alias: {
        components:  path.resolve(__dirname, 'src', 'components'),
        navigation:  path.resolve(__dirname, 'src', 'navigation'),
        reducers:    path.resolve(__dirname, 'src', 'reducers'),
        actions:     path.resolve(__dirname, 'src', 'actions'),
        routes:      path.resolve(__dirname, 'src', 'routes'),
        utils:       path.resolve(__dirname, 'src', 'utils'),
        styles:      path.resolve(__dirname, 'src', 'styles'),
        images:      path.resolve(__dirname, 'public', 'images'),
        public:      path.resolve(__dirname, 'public'),
        test:        path.resolve(__dirname, 'src', 'test'),
        materialize: path.resolve(__dirname, 'node_modules', 'materialize-css', 'sass', 'components')
      },
      // extensions: ['.webpack-loader.js', '.web-loader.js', '.loader.js', '.js', '.jsx'],
      modules: [
        path.resolve(__dirname, 'node_modules'),
        sourcePath
      ]
    },
    optimization: {
          splitChunks: {
              cacheGroups: {
                  js: {
                      test: /\.js$/,
                      name: "commons",
                      chunks: "all",
                      minChunks: 7,
                  },
                  styles: {
                    test: /\.(scss|sass|css)$/,
                    name: "styles",
                    chunks: "all",
                    enforce: true
                  }
              }
          }
    },
  plugins: [
    new CleanWebpackPlugin(['dist']),
    new CopyWebpackPlugin([ { from: __dirname + '/public', to: __dirname + '/dist/public' } ]),
    new MiniCssExtractPlugin({filename: "[name].css"}),
    new webpack.NamedModulesPlugin(),
    new HtmlWebpackPlugin({
       "template": "./src/template.html",
       "filename": "index.html",
       "hash": false,
       "inject": true,
       "compile": true,
       "favicon": false,
       "minify": true,
       "cache": true,
       "showErrors": true,
       "chunks": "all",
       "excludeChunks": [],
       "title": "ShareWalks",
       "xhtml": true,
       "chunksSortMode": 'none' //fixes bug
       })
   ]
};

webpack.prod.js

 const merge = require('webpack-merge');
 const common = require('./webpack.common.js');
const WorkboxPlugin = require('workbox-webpack-plugin');


 module.exports = merge(common, {
   mode: 'production',
   devtool: 'source-map',
   plugins: [
          new WorkboxPlugin.GenerateSW({ 
          // these options encourage the ServiceWorkers to get in there fast     
           // and not allow any straggling "old" SWs to hang around     
           clientsClaim: true,     
           skipWaiting: true
      }),
   ]
});
4

1 回答 1

0

您的问题对于 SO 来说太宽泛了,将被关闭:) 让我们专注于“如何使捆绑更小”的优化路径。

1.尝试babel松散编译(代码少)

module.exports = {
  "presets": [
    ["@babel/preset-env", {
      // ...
      "loose": true
    }]
  ],
}

2.还检查你的polyfills,使用缩小,学习webpacknull-loader技术。

3.希望更积极的分块可以产生一些积极的影响(如果不是所有的都用在你的每个应用页面上,那么它可以被延迟加载)。

optimization: {
    runtimeChunk: 'single',
    splitChunks: {
      chunks: 'all',
      maxInitialRequests: infinity,
      cacheGroups: {
        vendor: {
          test: /[\\/]node_modules[\\/]/,
          vendorname(v) {
            var name = v.context.match(/[\\/]node_modules[\\/](.*?)([\\/]|$)/)[1];
            return `npm.${name.replace('@', '_')}`;
          },
        },
      },
于 2018-10-06T20:08:00.860 回答