Vueルーティングの怠惰なロードを実現する方法とパッケージの問題
3434 ワード
一、ルートの怠惰なロードを実現する方式
Webpackはamd、commonJS、es 6の3つのモジュール構文をサポートしているため、vueがダイナミックパスを実現するには3つの方法があります.
1.AMD仕様を使用したrequire構文
この構文では、モジュールの名前を指定することはできません.デフォルトでは、webpack構成の
2.commonJS仕様のrequireを使用する.ensure構文
require.ensure()はwebpack特有で、import()に取って代わられています.
この構文と次のimport構文は、モジュール名を指定できます.
3.ES 6オリジナルのimport構文を使う
これはvue-cli 3のデフォルトの使用方法です.
二、怠惰なロードで発生する可能性のあるパッケージの問題
以上の3つの方法では、パスパラメータに変数が含まれている場合、webpackパッケージに問題が発生します.
1.import()は、そのコンポーネントが存在するディレクトリ内のすべてのコンポーネントを導入します.
これにより、ルーティングに構成されていない場合でも、
2.require()とrequire.Ensureは、変数付きのすべてのルーティングコンポーネントをjsにパッケージ化します.
したがって、パスパラメータに変数を持ち込まないようにします.
Webpackはamd、commonJS、es 6の3つのモジュール構文をサポートしているため、vueがダイナミックパスを実現するには3つの方法があります.
1.AMD仕様を使用したrequire構文
const routes = [
{
path: '/',
name: 'Home',
component: Home
},
{
path: '/about',
name: 'About',
component: resolve => require(['../views/About.vue'], resolve)
},
]
この構文では、モジュールの名前を指定することはできません.デフォルトでは、webpack構成の
output.chunkFileName
が使用されます.2.commonJS仕様のrequireを使用する.ensure構文
require.ensure()はwebpack特有で、import()に取って代わられています.
const routes = [
{
path: '/',
name: 'Home',
component: Home
},
{
path: '/about',
name: 'About',
component: resolve => require.ensure([], () => resolve(
require('@/' + about + '.vue')
), 'about')
},
]
この構文と次のimport構文は、モジュール名を指定できます.
3.ES 6オリジナルのimport構文を使う
const routes = [
{
path: '/',
name: 'Home',
component: Home
},
{
path: '/about',
name: 'About',
// route level code-splitting
// this generates a separate chunk (about.[hash].js) for this route
// which is lazy-loaded when the route is visited.
component: () => import(/* webpackChunkName: "about" */ '../views/About.vue')
},
]
これはvue-cli 3のデフォルトの使用方法です.
二、怠惰なロードで発生する可能性のあるパッケージの問題
以上の3つの方法では、パスパラメータに変数が含まれている場合、webpackパッケージに問題が発生します.
1.import()は、そのコンポーネントが存在するディレクトリ内のすべてのコンポーネントを導入します.
const about = 'views/About'
const routes = [
{
path: '/',
name: 'Home',
component: Home
},
{
path: '/about',
name: 'About',
component: () => import(/* webpackChunkName: "about" */ `../${about}.vue`)
},
]
これにより、ルーティングに構成されていない場合でも、
views
ディレクトリの下のすべてのコンポーネントがパッケージ化されます.したがって、wbepackChunkName
で指定されたファイル名も変更され、上記のAbout
ページコンポーネントはabout1
、about2
のような名前にパッケージされます.後続のルーティング構成のパスパラメータにも変数がある場合は、webpackChunkName
を指定しても、最初のimportで指定されたwebpackChunkName
に従ってパッケージされます.例:const routes = [
{
path: '/',
name: 'Home',
component: Home
},
{
path: '/about',
name: 'About',
component: () => import(/* webpackChunkName: "about" */ `../${about}.vue`) // about2.js
},
{
path: '/test',
name: 'Test',
component: () => import(/* webpackChunkName: "test" */ `../${test}.vue`) // about3.js , test.js
},
2.require()とrequire.Ensureは、変数付きのすべてのルーティングコンポーネントをjsにパッケージ化します.
let home = 'views/Home'
let about = 'views/About'
let test = 'views/Test'
const routes = [
{
path: '/',
name: 'Home',
component: Home
},
{
path: '/about',
name: 'About',
component: resolve => require(['../' + about + '.vue'], resolve)
},
{
path: '/test',
name: 'Test',
component: resolve => require(['../' + test + '.vue'], resolve)
},
about
ページコンポーネントとtest
ページコンポーネントは、同じjsファイルにパッケージされます.したがって、パスパラメータに変数を持ち込まないようにします.