webpack code splitting

代码拆分方案

1. Code Splitting - CSS
使用插件:npm i --save-dev extract-text-webpack-plugin

+var ExtractTextPlugin = require('extract-text-webpack-plugin');
 module.exports = {
    module: {
         rules: [{
             test: /\.css$/,
-            use: 'css-loader'
+            use: ExtractTextPlugin.extract({
+                use: 'css-loader'
+            })
         }]
     },
+    plugins: [
+        new ExtractTextPlugin('styles.css'),
+    ]
}

2. Code Splitting - Libraries
使用:CommonsChunkPlugin

var webpack = require('webpack');
var path = require('path');

module.exports = function() {
    return {
        entry: {
            main: './index.js',
            vendor: 'moment'
            // 将第三方lib,单独打包到一个 bundle 中,充分利用浏览器基于内容的 hash 缓存策略
        },
        output: {
            filename: '[name].[chunkhash].js',
            path: path.resolve(__dirname, 'dist')
        },
        plugins: [
            new webpack.optimize.CommonsChunkPlugin({
                name: 'vendor',
                minChunks: function (module) {
                   // this assumes your vendor imports exist in the node_modules directory
                   return module.context && module.context.indexOf('node_modules') !== -1;
                }
            }),
            //CommonChunksPlugin will now extract all the common modules from vendor and main bundles
            new webpack.optimize.CommonsChunkPlugin({
                name: 'manifest'
                //每次webpack工程时运行时代码发生改变,单独抽取运行时代码到清单文件中,
                // 所产生的开销通过浏览器缓存 Vendor 文件可以抵消回来
            })
        ]
    };
}

3. Code Splitting - Using import()
使用:

  1. npm install --save-dev babel-core babel-loader babel-plugin-syntax-dynamic-import babel-preset-es2015
  2. npm install --save moment
function determineDate() {
  import('moment')
    .then(moment => moment().format('LLLL'))
    .then(str => console.log(str))
    .catch(err => console.log('Failed to load moment', err));
}

determineDate();
  1. Usage with Babel and async / await
    To use ES2017 async/await with import()
    使用:npm install --save-dev babel-plugin-transform-async-to-generator babel-plugin-transform-regenerator babel-plugin-transform-runtime
async function determineDate() {
  const moment = await import('moment');
  return moment().format('LLLL');
}

determineDate().then(str => console.log(str));

webpack.config.js

module.exports = {
  entry: './index-es2017.js',
  output: {
    filename: 'dist.js',
  },
  module: {
    rules: [{
      test: /\.js$/,
      exclude: /(node_modules)/,
      use: [{
        loader: 'babel-loader',
        options: {
          presets: [['es2015', {modules: false}]],
          plugins: [
            'syntax-dynamic-import',
            'transform-async-to-generator',
            'transform-regenerator',
            'transform-runtime'
          ]
        }
      }]
    }]
  }
};

4. Code Splitting - Using require.ensure
webpack提出代码拆分的方案,可以将应用代码拆分为多个(chunk),每个块包含一个或多个模块,块可以按需异步加载
语法:
require.ensure(dependencies: String[], callback: function(require), chunkName: String)

require('./a');
require.ensure(["module-a"],function(require){
    var a = require("./b");
}, 'custom-chunk-name');
var a = require("./c");
// module-a.js 和 b.js 绑定在一起,并从主包中拆分。但是只执行 b.js 的内容。 module-a.js的内容只能提供,不能执行。
// 要执行module-a.js,必须使用同步的方式来要求它,例如require('./module-a.js')来执行JavaScript。

通过require.ensure声明依赖module-a,module-a的实现及其依赖会被合并为一个单独的块,对应一个结果文件
当执行到require.ensure才去加载module-a所在的结果文件,并在module-a加载就绪后在执行传入的回调函数。(其中加载行为和回调函数执行时机控制由webpack实现。这对业务代码的侵入性极小)
在真实使用中,需要被拆分出来的可能是某个体积极大的第三方库(延后加载并使用),也可能是一个点击触发浮层的内部逻辑(除非触发条件得到满足,否则不需要加载执行),异步加载可以让我们以极小的代价,来极大地提升大规模单页面应用的初始加载速度


import 取代 require.ensure
Good news: Failure to load a chunk can be handled now because they are Promise based.
import 由于它是基于 Promise的,现在还不能加载 chunk

Caveat: require.ensure allows for easy chunk naming with the optional third argument, but import API doesn't offer that capability yet.
注意事项:require.ensure允许使用可选的第三个参数进行简单的块命名,但是 import API 还没有提供该功能。



模块热替换

webpack-dev-server --hot
时间: 2024-09-13 14:31:51

webpack code splitting的相关文章

【翻译】基于 Create React App路由4.0的异步组件加载(Code Splitting)

基于 Create React App路由4.0的异步组件加载 本文章是一个额外的篇章,它可以在你的React app中,帮助加快初始的加载组件时间.当然这个操作不是完全必要的,但如果你好奇的话,请随意跟随这篇文章一起用Create React App和 react路由4.0的异步加载方式来帮助react.js构建大型应用. 代码分割(Code Splitting) 当我们用react.js写我们的单页应用程序时候,这个应用会变得越来越大,一个应用(或者路由页面)可能会引入大量的组件,可是有些组

看懂前端脚手架你需要这篇WEBPACK

本文转载自网络.转载编辑过程中,可能有遗漏或错误,请以原文为准. 原文作者:二口南洋 原文链接: https://gold.xitu.io/post/586ddb8ab123db005d0b65cb Webpack 是当下最热门的前端资源模块化管理和打包工具.它可以将许多松散的模块按照依赖和规则打包成符合生产环境部署的前端资源.还可以将按需加载的模块进行代码分隔,等到实际需要的时候再异步加载.通过loader 的转换,任何形式的资源都可以视作模块,比如 CommonJs 模块. AMD 模块.

关键CSS和Webpack: 减少阻塞渲染的CSS的自动化解决方案

"消除阻塞渲染的CSS和JavaScript". 这一条Google Page Speed Insights的建议总让我困惑. 当一个网页被访问时,Google希望它仅加载对初始视图有用的内容,并使用空闲时间来加载其他内容.这种方式可以使用户尽可能早地看到页面. 我们可以做很多事情来减少阻塞渲染的JavaScript,例如code splitting.tree shaking,缓存等. 但是如何减少阻塞渲染的CSS?为此,可以拆分并优先加载首次渲染所需要的CSS(关键CSS),然后再加

细说 webpack 之流程篇

引言 目前,几乎所有业务的开发构建都会用到 webpack .的确,作为模块加载和打包神器,只需配置几个文件,加载各种 loader 就可以享受无痛流程化开发.但对于 webpack 这样一个复杂度较高的插件集合,它的整体流程及思想对我们来说还是很透明的.那么接下来我会带你了解 webpack 这样一个构建黑盒,首先来谈谈它的流程. 准备工作 1. webstorm 中配置 webpack-webstorm-debugger-script 在开始了解之前,必须要能对 webpack 整个流程进行

前端知识体系全部

一些开放性题目 1.自我介绍:除了基本个人信息以外,面试官更想听的是你与众不同的地方和你的优势.  2.项目介绍  3.如何看待前端开发?  4.平时是如何学习前端开发的?  5.未来三到五年的规划是怎样的? position的值, relative和absolute分别是相对于谁进行定位的? absolute :生成绝对定位的元素, 相对于最近一级的 定位不是 static 的父元素来进行定位. fixed (老IE不支持)生成绝对定位的元素,通常相对于浏览器窗口或 frame 进行定位. r

Redux系列x:源码解析

写在前面 redux的源码很简洁,除了applyMiddleware比较绕难以理解外,大部分还是 这里假设读者对redux有一定了解,就不科普redux的概念和API啥的啦,这部分建议直接看官方文档. 此外,源码解析的中文批注版已上传至github,可点击查看.本文相关示例代码,可点击查看. 源码解析概览 将redux下载下来,然后看下他的目录结构. npm install redux 这里我们需要关心的主要是src目录,源码解析需要关心的文件都在这里面了 index.js:redux主文件,主

Use webpack together with browser-sync

Here are some tips about using webpack and Browsersync to improve working speed. Browsersync Browsersync makes your browser testing workflow faster by synchronising URLs, interactions and code changes across multiple devices. npm install browser-sync

Path to a Trusted Front-end Code Protection

Introduction As an appealing objective in the information security field, a trusted system refers to a system that achieves a certain degree of trustworthiness by implementing specific security policies. For computers, the Trusted Platform Module (TP

Code Review for Vue 2.0 Preview

是的!Vue 2.0 发布了! Vue 2.0 preview 仓库在此 首先,当我第一次看到 Vue 2.0 的真面目的时候,我的内心是非常激动的 Demo 来个简单的 demo,首先把 dist/vue.js 导入到一个空白的网页里,然后写: 当然,在大家阅读下面所有的内容之前,先想象一下,这是一个运行时 min+gzip 后只有 12kb 大小的库 <script src="./dist/vue.js"></script> <div id="