webpack之代码分离
https://robertknight.github.io/posts/webpack-dll-plugins/
webpack一般会把一个文件里import/require的文件都会打包在一起,最近就在做这方面的工作,文件全部打包在一起了 对服务器的请求确实减少了,可是对于jquery和jquery的插件如果在每个文件重复打包,文件大了加载会很慢,而且也没法给jquery和插件做缓存,因为像jquery这样的库 一般是可以放在CDN缓存的,如果如果每个人文件重复打包是完全没法做缓存处理的。
经过各种google,终于找出了一个 还算不错的办法。
首先安装各种插件,比如:npm install jquery, npm install md5 等等
但是项目用到的弹出层layer不能直接通过npm install layer安装,需要通过github地址安装,如下:
npm install https://github.com/sentsin/layer --save
通过DllPlugin插件生成mainfest.json,并把jquery插件按照id打包
jquery和插件一起打包后,可是插件里还是找不到$, 比如在调用
var layer2 = window.jquery_library(2);时 提示 jquery.dll.js:10479 Uncaught TypeError: $ is not a function,如何解决了,在dll配置里加上
new webpack.ProvidePlugin({
$: "jquery",
jQuery: "jquery",
"window.jQuery": "jquery"
})
在用到jquery的地方,需要每次var $ = window.jquery_library(1);这样修改的文件会比较多,我们可以在一个公用的文件里配置好 全局的,把$ 和jquery暴露在全局,如下:
window.jQuery = window.$ = window.jquery_library(1);
另外我们在打包的时候就打包在public/plugins里,把项目中用到的jquery插件也可以放在里面,然后在打包的时候把plugins文件通过webpack插件copy-webpack-plugin复制到打包文件夹里,比如:
var CopyWebpackPlugin = require('copy-webpack-plugin'); //复制文件
plugins.push(new CopyWebpackPlugin([
{ from: publicPathJS+'/plugins',to: 'public/plugins'}
]));
在每次打包的时候,特别是打打的版本好不一样,需要首先清空打包文件夹的文件,然后重新打包,我们通常会用到webpack插件clean-webpack-plugin
var CleanWebpackPlugin = require('clean-webpack-plugin'); //清空文件夹里的文件
//打包之前先删除打包文件里的文件方便重新打包
plugins.push(new CleanWebpackPlugin(['prod'], {
root: basePath,
verbose: true,
dry: false,
watch:true,
exclude: ['plugins']
}));
exclude表示不需要清除的文件夹活着文件名称
要导入多个模块中的接口,你可以这样写:
import {detectCats, Kittydar} from "kittydar.js";
当你运行一个包含 import 声明的模块,被引入的模块会先被导入并加载,然后根据依赖关系,每一个模块的内容会使用深度优先的原则进行遍历。跳过已经执行过的模块,以此避免依赖循环。
默认导出
新一代的标准的设计理念是兼容现有的 CommonJS 和 AMD 模块。所以如果你有一个 Node 项目,并且刚刚执行完 npm install lodash,你的 ES6 代码可以独立引入 Lodash 中的函数:
import {each, map} from "lodash";
each([3, 2, 1], x => console.log(x));
然而如果你已经习惯了 _.each 或者看不见 _ 的话就浑身难受,当然这样使用 Lodash 也是不错的方式。
这种情况下,你可以稍微改变一下你的 import 写法,不写花括号:
import _ from "lodash";
这个简写等价于 import {default as _} from "lodash";。所有 CommonJS 和 AMD 模块在被 ES6 代码使用的时候都已经有了默认的导出,这个导出和你在 CommonJS 中 require() 得到的东西是一样的,那就是 exports 对象
Webpack 构建后文件变得很大?
使用 Webpack 打包,前端工程师可以按 CommonJS 或 ES6 Module 的规范写前端 JS 代码,使模块源代码看起来跟后端代码一样简洁,但是,很快发现文件太大(尤其基于 React 进行开发的应用,如果是单页面程序?更大了),为了解决问题,以下是我每次必用的策略:
按需加载 「 Code Split 」
提取公共代码 「 CommonsChunkPlugin 」
第三方库分开打包 「 DllPlugin 」
代码压缩「 UglifyJSPlugin 」
Code Split 概念
Webpack 支持多种模块加载方式。CommonJS 的 require 和 ES6 的 import 是同步加载的,通过这些方式引入的依赖会被 Webpack 打包在一起,文件因而变大。而 AMD 或 CommonJS 的 require.ensure 是按需加载「异步的」,对于一些可以延迟加载的模块「依赖」,应该用这种方式,从而避免文件太大。
同步加载的模块被打包在同一个 chunk 「 一个 chunk 是一个 JS 文件,由一个或若干个模块组成 」,而通过异步加载的模块被打包在另外的 chunk 里,Webpack 以此来进行分片,即 Code split。
Code Split 的方式
AMD : require
CommonJS : require.ensure
ES : System.import
chunk 的内容组成
通过 Code Split 分片,新的 chunk 由异步模块和这些模块的依赖构成。这些模块的依赖按同样的规则构建,即同步加载的模块打包在同一个 chunk,异步加载的模块被切分到新的 chunk。具体看下面的例子,请注意看代码注释的内容,build 目录里的三个文件是 Webpack 打包最终生成的。
Code Split 优化
从上面的例子可见,Code Split 分出来了两个 chunk,即 1.bundle 和 2.bundle,从而减小了主 chunk bundle.js 的文件大小,减轻程序初始化的网络等待。然而,新的问题出现了,1.bundle 和 2.bundle 都包含 io 模块,可见 io 模块有冗余。带着这个问题,下一篇总结 CommonsChunkPlugin 的使用
webpack之代码分离的更多相关文章
- 使用Webpack的代码分离实现Vue懒加载(译文)
当一个Vue的项目体积变得十分庞大的时候,使用Webpack的代码分离功能将Vue Components,routes或Vuex的代码进行分离并按需加载,会极大的提高App的首屏加载速度. 在Vue的 ...
- 使用Webpack的代码分离实现Vue懒加载
当一个Vue的项目体积变得十分庞大的时候,使用Webpack的代码分离功能将Vue Components,routes或Vuex的代码进行分离并按需加载,会极大的提高App的首屏加载速度. 在Vue的 ...
- Webpack 代码分离
Webpack 代码分离 代码分离是 webpack 中最引人注目的特性之一. 你可以把你的代码分离到不同的 bundle 中,然后你就可以去按需加载这些文件. 总的来说, webpack 分离可以分 ...
- Webpack 2 视频教程 017 - Webpack 2 中分离打包项目代码与组件代码
原文发表于我的技术博客 这是我免费发布的高质量超清「Webpack 2 视频教程」. Webpack 作为目前前端开发必备的框架,Webpack 发布了 2.0 版本,此视频就是基于 2.0 的版本讲 ...
- webpack代码分离 ensure 看了还不懂,你打我(转)
webpack异步加载的原理 webpack ensure相信大家都听过.有人称它为异步加载,也有人说做代码切割,那这 个家伙到底是用来干嘛的?其实说白了,它就是把js模块给独立导出一个.js文件的, ...
- webpack学习之—— Code Spliting(代码分离)
代码分离特性能够把代码分离到不同的 bundle 中,然后可以按需加载或并行加载这些文件.代码分离可以用于获取更小的 bundle,以及控制资源加载优先级,如果使用合理,会极大影响加载时间. 有三种常 ...
- react-router之代码分离
概念 无需用户下载整个应用之后才能访问访问它.即边访问边下载.因此我们设计一个组件<Bundle>当用户导航到它是来动态加载组件. import loadSomething from 'b ...
- 转载-使用 Feed4JUnit 进行数据与代码分离的 Java 单元测试
JUnit 是被广泛应用的 Java 单元测试框架,但是它没有很好的提供参数化测试的支持,很多测试人员不得不把测试数据写在程序里或者通过其它方法实现数据与代码的分离,在后续的修改和维护上有诸多限制和不 ...
- 使用Underscore.js的template将Backbone.js的js代码和html代码分离
这段时间在学习Require.js和Backbone.js的过程中,发现有些项目里的HTML代码都是写在View的js代码里面的,渲染的时候需要对Collection进行循环,再将HTML代码拼接上去 ...
随机推荐
- 关于自定义jar包(tomcat)的添加
1 鼠标右击工程 选择 properties 或者 Ait + Enter 2 选择Libraries 3 点击Add Library... 4 选择User Library 点击 Next 5 如 ...
- (转)StringTokenizer类的使用
StringTokenizer是一个用来分隔String的应用类,相当于VB的split函数.1.构造函数public StringTokenizer(String str)public String ...
- HTTP Request header
HTTP Request header HTTP协议详解 - 小坦克 - 博客园 HTTP Request header 当今web程序的开发技术真是百家争鸣,ASP.NET, PHP, JSP,Pe ...
- IFeatureLayer
All Properties Methods Inherited Non-inherited Description AreaOfInterest The default area of inte ...
- 整理JRE瘦身或精简JRE
http://blog.csdn.net/xiaoping8411/article/details/6973887 版权声明:本文为博主原创文章,未经博主允许不得转载. 前不久给朋友做了一个桌面程序, ...
- nginx+fastcgi php 使用file_get_contents、curl、fopen读取localhost本站点.php异常的情况
原文:http://www.oicto.com/nginx_fastcgi_php_file_get_contents/ 参考:http://os.51cto.com/art/201408/44920 ...
- hadoop hdfs uri详解
body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...
- sed基本用法
sed命令基本用法sed是一个非交互式文本编辑器,它可以对文本文件和标准输入进行编辑,标准输入可以是来自键盘输入.文件重定向.字符串.变量.来自管道的文本等等.sed从文本的一个文本行或标准输入中读取 ...
- apache、nginx、iis 全球分布
从下图(2012年8月份的数据)来看,来自俄罗斯的Nginx服务器,主要使用区域也集中在俄罗斯及周边国家.微软的IIS,在中国使用最多,占其总份额的57.6%,其他国家如埃及.沙特阿拉伯等国家也基本使 ...
- 鸽笼原理的运用HDU1205
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1205 题目解析:开始没看清题,WA了一发,以为只要最大的次大的差2就是NO,后来仔细看过之后才发现,, ...