Webpack 代码分离
Webpack 代码分离
? 提示:
版本问题
本文基于
webpack 2.x
版本。webpack 2.x
相比webpack 1.x
有重大改变。所以,如果你的项目中已使用了 webpack 1.x ,本教程的示例将不适用,请慎重。如果铁了心要升级 webpack ,请参考 webpack 官方文档 - 从 v1 迁移到 v2
阅读建议
阅读本文前,建议先阅读 Webpack 概念 。
代码分离是 webpack 中最引人注目的特性之一。
你可以把你的代码分离到不同的 bundle 中,然后你就可以去按需加载这些文件。
总的来说, webpack
分离可以分为两类:
- 资源分离
- 代码分离
资源分离(Resource Splitting)
对第三方库(vendor) 和 CSS 进行代码分离,这些方式有助于实现缓存和并行加载。
分离 CSS(CSS Splitting)
你可能也想将你的样式代码分离到单独的 bundle 中,以此使其独立于应用程序逻辑。这加强了样式的可缓存性,并且使得浏览器能够并行加载应用程序代码中的样式文件,避免 FOUC 问题 (无样式内容造成的闪烁)。
安装 ExtractTextWebpackPlugin
如下
$ npm install --save-dev extract-text-webpack-plugin
webpack.config.js 中需要按下面进行配置:
const ExtractTextPlugin = require('extract-text-webpack-plugin');module.exports = {// 关于模块配置module: {// 模块规则(配置 loader、解析器等选项)rules: [{// css 加载test: /\.css$/,use: ExtractTextPlugin.extract({use: "css-loader"})}]},// 附加插件列表plugins: [// 将样式文件独立打包new ExtractTextPlugin("styles.css")]
};
? 示例DEMO09: (DEMO / SOURCE)
分离第三方库(Vendor Code Splitting)
一个典型的应用程序,由于框架/功能性需求,会依赖于许多第三方库的代码。不同于应用程序代码,这些第三方库代码不会频繁修改。
如果我们将这些库(library)中的代码,保留在与应用程序代码相独立的 bundle 中,我们就可以利用浏览器缓存机制,把这些文件长时间地缓存在用户机器上。
为了完成这个目标,不管应用程序代码如何变化,vendor 文件名中的 hash
部分必须保持不变。学习如何使用 CommonsChunkPlugin
分离 vendor/library 代码。
webpack.config.js
const webpack = require('webpack');module.exports = {// 这里应用程序开始执行// webpack 开始打包// 本例中 entry 为多入口entry: {main: "./app/index",vendor: "react"},// webpack 如何输出结果的相关选项output: {// 所有输出文件的目标路径// 必须是绝对路径(使用 Node.js 的 path 模块)path: path.resolve(__dirname, "dist"),// 「入口分块(entry chunk)」的文件名模板(出口分块?)// filename: "bundle.min.js",// filename: "[name].js", // 用于多个入口点(entry point)(出口点?)// filename: "[chunkhash].js", // 用于长效缓存filename: "[name].[chunkhash:8].js", // 用于长效缓存},// 附加插件列表plugins: [new webpack.optimize.CommonsChunkPlugin({name: "vendor" // 指定公共 bundle 的名字。})]
};
在上面的配置中,
- 在
entry
属性中,将 react 指定为一个独立的入口 vendor; - 然后,在
output
属性中,将 filename 指定为 [name].[chunkhash:8].js,这表示输出文件的文件名样式。 - 最后在
plugins
列表中引入 CommonsChunkPlugin 插件,用来指定 bundle 。
执行 webpack 命令后,webpack 会生成 2 个 bundle 文件,形式如:
main.bef8f974.js
vendor.2f1bd4c8.js
? 示例DEMO10: (DEMO / SOURCE)
代码按需分离(On Demand Code Splitting)
虽然前面几类资源分离,需要用户预先在配置中指定分离模块,但也可以在应用程序代码中创建动态分离模块。
这可以用于更细粒度的代码块,例如,根据我们的应用程序路由,或根据用户行为预测。这可以使用户按照实际需要加载非必要资源。
前一节,我们了解了 webpack 可以将资源拆分为bundle。接下来,我们要学习如何异步加载。例如,这允许首先提供最低限度的引导 bundle,并在稍后再异步地加载其他功能。
webpack 支持两种相似的技术实现此目的:使用 import()
(推荐,ECMAScript 提案) 和 require.ensure()
(遗留,webpack 特定)。本文只介绍官方推荐的 import()
方式。
ES2015 loader 规范定义了 import()
作为一种在运行时(runtime)动态载入 ES2015 模块的方法。
webpack 把 import()
作为一个分离点(split-point),并把引入的模块作为一个单独的 chunk。 import()
将模块名字作为参数并返回一个 Promoise
对象,即 import(name) -> Promise
配合 Babel 使用
如果你想要在 Babel 中使用 import
,但是由于 import() 还是属于 Stage 3 的特性,所以你需要安装/添加 syntax-dynamic-import
插件来避免 parser 报错。在草案正式成为规范后,就不再需要这个插件了。
例:
我们来定义一个 Clock 组件,动态引入 moment 库。
首先,安装 moment 库。
$ npm install --save-dev moment
JavaScript 代码:
class Clock extends React.Component {constructor(props) {super(props);this.state = { date: new Date().toLocaleDateString() };this.click = this.click.bind(this);}click() {// 动态引入import()import('moment').then(moment => moment().format("MMMM Do YYYY, h:mm:ss a")).then(str => this.setState({date:str})).catch(err => console.log("Failed to load moment", err));}render() {return (<div><h2>It is {this.state.date}.</h2><p onClick={this.click}>Click here to changing the time.</p></div>);}
}
webpack.config.js
// 关于模块配置
module: {// 模块规则(配置 loader、解析器等选项)rules: [{// 语义解释器,将 js/jsx 文件中的 es2015/react 语法自动转为浏览器可识别的 Javascript 语法test: /\.jsx?$/,include: path.resolve(__dirname, "app"),// 应该应用的 loader,它相对上下文解析// 为了更清晰,`-loader` 后缀在 webpack 2 中不再是可选的// 查看 webpack 1 升级指南。loader: "babel-loader",// loader 的可选项options: {presets: ["es2015", "react"],plugins: ['syntax-dynamic-import']},},]
},
? 示例DEMO11: (DEMO / SOURCE)
Webpack 系列教程
欢迎阅读其它内容:
- Webpack 概念
- Webpack 入门
- Webpack 资源管理
- Webpack 代码分离
- Webpack 开发工具
转载于:https://www.cnblogs.com/jingmoxukong/p/7016156.html
Webpack 代码分离相关推荐
- 使用Webpack的代码分离实现Vue懒加载(译文)
当一个Vue的项目体积变得十分庞大的时候,使用Webpack的代码分离功能将Vue Components,routes或Vuex的代码进行分离并按需加载,会极大的提高App的首屏加载速度. 在Vue的 ...
- 一看就会的webpack的代码分离(分包)优化首屏加载实践
1.背景 在开发过程中,发现首屏加载过慢导致用户体验不佳,因此boss一声令下,需要可怜唯唯诺诺的前端来进行优化. 在优化过程中可谓是踩坑无数,百思不得其解,到最后发现是不过如此.但是网上一篇完整的叙 ...
- Webpack系列——代码分离(Code Splitting)
代码分离(Code Splitting) // index.js import _ from 'lodash'; const ele = document.createElement('div'); ...
- webpack基础篇(五):代码分离(Code Splitting)
常用的代码分离方法有三种 1. 入口起点 问题 2. 防止重复 2.1 配置 entry 提取公用依赖 2.2 SplitChunksPlugin 3. 动态导入 3.1 import() 动态导入 ...
- java 页面 分离 实现_JavaBean实现JSP页面和代码分离
JavaBean实现JSP页面和代码分离以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在JSP编程中 Struts一般 ...
- HTML和JavaScript代码分离、平稳退化(1)
使用的编辑器是Hbuilder,浏览器是Chrome. HTML和JavaScript代码分离,会使得修改网页功能和代码的阅读与维护会轻松的许多,不用在DOM中阅读大量的JavaScript代码. 文 ...
- (转)flex中使用swc实现更好的界面代码分离
flex中使用swc实现更好的界面代码分离 转自:http://www.cnblogs.com/yjmyzz/archive/2010/07/26/1785265.html 前几天写过一篇" ...
- 转载-使用 Feed4JUnit 进行数据与代码分离的 Java 单元测试
JUnit 是被广泛应用的 Java 单元测试框架,但是它没有很好的提供参数化测试的支持,很多测试人员不得不把测试数据写在程序里或者通过其它方法实现数据与代码的分离,在后续的修改和维护上有诸多限制和不 ...
- javascript 代码分离 的那些事儿
javascript 代码分离 的那些事儿 注意: 我们时常都需要修改代码,因此,我们需要把代码调整为代码分离状态,并让它保持良好的代码分离状态. 核心概念 就是 保持行为层.内容层.表现层的分离. ...
最新文章
- 【Zookeeper】windows环境下zookeeper安装
- 必须知道的 Visual Studio 快捷键
- 从本地的win传文件到本地的linux上,pscp.exe实现本地windows下的文件下载(传输)到linux上...
- 在tomcat中使用context节点部署工程
- C#执行cmd [转载]
- 【JQuery】使用JQuery 合并两个 json 对象
- attachRouteMatched analysis
- html ajax 数据传送,HTML AJAX 简单数据JS
- java spring bean配置文件_Spring基于xml文件配置Bean过程详解
- websocket java 例子_java 实现websocket的两种方式实例详解
- 用上Latex实现编辑伪代码
- super-smack
- python论文题目_有关利用python获取网页, 以及KDD近几年论文标题与摘要链接
- android多音字排序,再谈Contacts中姓氏多音字排序错误问题
- gRPC接口性能测试
- 001电机的分类:不骗你,如果你没读这篇文章,可能都不知道还有这种类型的电机!
- 前端性能优化gzip压缩
- Idling along, (or what to do in the idle task)
- 浏览器是先执行js还是先加载HTML,在HTML中使用JavaScript(浏览器对js的加载机制分析)...
- JBPM学习入门(一) 配置JBPM运行环境
热门文章
- 知乎高赞:OracleJDK和OpenJDK有什么区别?网友:不愧是大神的回答~
- 如何在Java代码中去掉烦人的“!=null”
- 小说:白话幂等性设计
- 腾讯优图+厦门大学发布!2021十大人工智能趋势
- SQL_Case When 嵌套
- 北大毕业典礼上,一男博士求婚女硕士成功,网友直呼:科研人的爱情太甜了!...
- 海外博士一般朝九晚五,国内博士动辄十几个小时科研时间。为什么普遍认为海外博士水平比较高?...
- 彻底搞懂机器学习中的正则化
- 谷歌力作:神经网络训练中的Batch依赖性很烦?那就消了它!
- JVM调优:基本垃圾回收算法