Laravel Vue Non SPA - 如何为其 vue js 组件拆分每个页面的文件?

Leo*_*ldz 7 laravel webpack vue.js vuejs2

我的应用程序使用 laravel vue 但不使用 SPA,..所以我仍然使用 laravel Blade 来分隔页面。每个页面都导入app.js。我的 App.js 由 webpack 编译,我的所有 vue 组件都在该文件上编译。所以问题是 app.js 获取 MB 大小,并且每个页面加载该文件的速度都会变慢。他们的方法是分割 vuejs 代码还是使用 webpack 分离每个页面的文件?

这是我的 Web 应用程序中的 webpack.js。

const mix = require('laravel-mix');

/*
 |--------------------------------------------------------------------------
 | Mix Asset Management
 |--------------------------------------------------------------------------
 |
 | Mix provides a clean, fluent API for defining some Webpack build steps
 | for your Laravel application. By default, we are compiling the Sass
 | file for the application as well as bundling up all the JS files.
 |
 */

mix.setPublicPath('public')
    .setResourceRoot('../') // Turns assets paths in css relative to css file
    // .options({
    //     processCssUrls: false,
    // })
    .sass('resources/sass/frontend/app.scss', 'css/frontend.css')
    .sass('resources/sass/backend/app.scss', 'css/backend.css')
    .js('resources/js/frontend/app.js', 'js/app.js')
    .js([
        'resources/js/backend/before.js',
        'resources/js/backend/app.js',
        'resources/js/backend/after.js'
    ], 'js/backend.js')

    .extract([
        // Extract packages from node_modules to vendor.js
        'jquery',
        'bootstrap',
        'popper.js',
        'axios',
        'sweetalert2',
        'lodash'
    ])
    .sourceMaps();

if (mix.inProduction()) {
    mix.version()
        .options({
            // Optimize JS minification process
            terser: {
                cache: true,
                parallel: true,
                sourceMap: true
            }
        });
} else {
    // Uses inline source-maps on development
    mix.webpackConfig({
        devtool: 'inline-source-map'
    });
}
Run Code Online (Sandbox Code Playgroud)

我的 laravel 使用 laravel 样板模板,他将其他文件分离到 vender.js 中。我的问题是 app.js 变得越来越大,对于连接速度较慢的用户来说将很难加载。

And*_*ong 3

据我所知,您能做的最好的事情就是使用Dynamic Importslaravel-mix在内部使用webpack 代码分割,并且最新版本的laravel-mix.

\n

将其添加到您的webpack.mix.js文件中

\n
mix.babelConfig({\n  plugins: [\'@babel/plugin-syntax-dynamic-import\'],\n});\n
Run Code Online (Sandbox Code Playgroud)\n

而且你还需要改变你的方式import组件的使用方式。

\n
// Standard import\nimport StandardComponent from \'./components/ExampleComponent.vue\';\n\n// Dynamic import\nconst DynamicallyImportedComponent =\n        () => import(\'./components/ExampleComponent.vue\');\n
Run Code Online (Sandbox Code Playgroud)\n

通过这种方式,laravel-mix将在单独的文件中编译该组件。并动态地将文件插入到您的html head部分中。因此只会在需要时插入文件。

\n

Webpack 会将动态导入的文件分割成 chunk,并命名为0.js,1.js等。如果要为文件配置 chunk 名称,需要在 import 语句中添加 \xe2\x80\x9cmagic\xe2\x80\x9d 注释告诉 Webpack 你想要使用的名称。就像你在一个webpack设置中所做的那样。喜欢:

\n
const DynamicallyImportedComponent =\n        () => import(/* webpackChunkName: "dynamically-imported-component" */ \'./components/ExampleComponent.vue\');\n
Run Code Online (Sandbox Code Playgroud)\n