1. Что такое разделение кода?
Когда я впервые использовал Webpack, я упаковал все файлы js в одинbuild.js
файл (имя файла зависит отwebpack.config.js
в файлеoutput.filename
), но в больших проектахbuild.js
Возможно, он слишком велик, что приводит к слишком долгой загрузке страницы. В настоящее время необходимоcode splitting
, code splitting
это разбить файл на куски(chunk)
, мы можем определить некоторые точки разделения(split point)
, файл разбивается на разделы в соответствии с этими точками разделения и загружается по запросу.
2. Роль разделения кода?
-
Сторонние библиотеки классов упакованы отдельно:
Поскольку содержимое сторонней библиотеки классов принципиально не изменится, его можно отделить от бизнес-кода, чтобы можно было максимально использовать механизм кэширования браузера и сократить количество запросов. -
Загрузка по требованию:
Webpack поддерживает определение точек разделения черезrequire.ensure
Выполнять по требованию.
3. Как выполнить разделение кода?
Приведенный ниже код основан наvue-cli
изwebpack-simple
Созданный по шаблону презентационный документ
//cmd
vue init webpack-simple code_spliting_demo
(1) Сторонняя библиотека классов упакована отдельно.
Мы предполагаем, что проект вводитjquery.js
а такжеrespond.js
, то мы можемwebpack.config.js
Настройте множественную запись для упаковки этих двух сторонних библиотек классов по отдельности.
-
существует
webpack.config.js
настроить//webpack.config.js //在entry中添加相应第三方类库 entry: { bundle: './src/main.js', vendor: ['./src/lib/jquery-1.10.2.min.js', './src/lib/respond.min.js'] } //在plugins中添加CommonChunkPlugin plugins:[ new webpack.optimize.CommonsChunkPlugin({ name: 'vendor', filename: 'vendor.bundle.js' }) ]
-
воплощать в жизнь
npm run build
, В настоящее времяdist
В каталоге создаются два файла, а именноbuild.js
а такжеvendor.bundle.js
Сгенерированные файлы после запуска сборки npm -
существует
index.html
Введено в, примечание:vendor.bundle.js
имеет приоритет надbuild.js
представлять//index.html <script src="/dist/vendor.bundle.js"></script> <script src="/dist/build.js"></script>
(2) Загрузка по требованию
мы можемrouter
Настройте компоненты по требованию, чтобы обеспечить загрузку компонентов по требованию.Если некоторые отдельные файлы компонентов большие, загрузка по требованию может уменьшитьbuild.js
, оптимизировать скорость загрузки (если размер компонента небольшой, то использование загрузки по требованию добавит дополнительныеhttp请求
, но увеличилось время загрузки)
-
Здесь мы добавляем 3 компонента, которые
A.vue
,B.vue
,C.vue
//A.vue <template> <h1>这里是A.vue组件</h1> </template> //B.vue <template> <h1>这里是B.vue组件</h1> </template> //C.vue <template> <h1>这里是C.vue组件</h1> </template>
-
Настроить в маршрутизации (примечание: это для удобства, это в
app.js
Маршруты добавлены в , в реальном проекте маршруты должны извлекаться отдельно)//app.js import Vue from 'vue' import App from './App.vue' import VueRouter from 'vue-router' Vue.use(VueRouter) //AMD规范的异步载入 const ComA = resolve => require(['./components/A.vue' ], resolve); const ComB = resolve => require(['./components/B.vue' ], resolve); const ComC = resolve => require(['./components/C.vue' ], resolve); const router = new VueRouter({ routes: [ { name: 'component-A', path: '/a', component: ComA }, { name: 'component-B', path: '/b', component: ComB }, { name: 'component-C', path: '/c', component: ComC } ] }) new Vue({ el: '#app', router: router, render: h => h(App) })
существует
webpack.config.js
настроить вoutput.chunkFilename
,
//webpack.config.js
output: {
path: path.resolve(__dirname, './dist'),
publicPath: '/dist/',
filename: 'build.js',
//添加chundkFilename
chunkFilename: '[name].[chunkhash:5].chunk.js'
}
-
воплощать в жизнь
npm run build
, В настоящее времяdist
В каталоге создано 5 файлов, а дополнительные 3 файла соответствуютA.vue
,B.vue
,C.vue
эти три компонентаФайлы, сгенерированные после запуска сборки npm
Асинхронная загрузка спецификации CMD
Когда маршрут только что был импортирован, я использовалAMD规范
Асинхронная загрузка .webpack
при условииrequire.ensure()
Этот метод реализуетCMD规范
асинхронная загрузка .Это такжеwebpack
Рекомендуемый способ загрузки Хотите узнать больше?ensure
, Пожалуйста, нажмите«Разделение кода веб-пакета гарантирует, что я все еще не понимаю после прочтения, вы попали в меня»
- Код ниже использует
require.ensure()
метод настройки маршрутизации
//app.js
import Vue from 'vue'
import App from './App.vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)
//AMD风格的异步加载
// const ComA = resolve => require(['./components/A.vue' ], resolve);
// const ComB = resolve => require(['./components/B.vue' ], resolve);
// const ComC = resolve => require(['./components/C.vue' ], resolve);
//CMD风格的异步加载
const ComA = resolve => require.ensure([], () => resolve(require('./components/A.vue')));
const ComB = resolve => require.ensure([], () => resolve(require('./components/B.vue')));
const ComC = resolve => require.ensure([], () => resolve(require('./components/C.vue')));
const router = new VueRouter({
routes: [
{
name: 'component-A',
path: '/a',
component: ComA
},
{
name: 'component-B',
path: '/b',
component: ComB
},
{
name: 'component-C',
path: '/c',
component: ComC
}
]
})
new Vue({
el: '#app',
router: router,
render: h => h(App)
})
- воплощать в жизнь
npm run build
назад,dist
5 файлов также создаются в каталогеФайлы, сгенерированные после запуска сборки npm
-
Демонстрация эффекта загрузки по требованию:Демонстрация эффекта загрузки по запросу