webpack打包缓存_webpack打包后调试的方法

本文详细讲解了如何使用webpack进行独立打包和缓存处理,包括:配置source-map选项,解决浏览器缓存问题,添加hash防止旧文件缓存,修改CommonsChunkPlugin配置,以及使用HtmlWebpackPlugin自动生成带hash的index.html。
摘要由CSDN通过智能技术生成

详解webpack打包后如何调试的方法步骤

webpack.config.js

在配置devtool时,webpack给我们提供了四种选项

source-map:在一个单独文件中产生一个完整且功能完全的文件。这个文件具有最好的source map,但是它会减慢打包速度;

cheap-module-source-map:在一个单独的文件中产生一个不带列映射的map,不带列映射提高了打包速度,但是也使得浏览器开发者工具只能对应到具体的行,不能对应到具体的列(符号),会对调试造成不便。

eval-source-map:使用eval打包源文件模块,在同一个文件中生产干净的完整版的sourcemap,但是对打包后输出的JS文件的执行具有性能和安全的隐患。在开发阶段这是一个非常好的选项,在生产阶段则一定要不开启这个选项。

cheap-module-eval-source-map:这是在打包文件时最快的生产source map的方法,生产的 Source map 会和打包后的JavaScript文件同行显示,没有影射列,和eval-source-map选项具有相似的缺点。

配置开发环境

module.exports = {

devtool: 'source-map',

entry:"",

output: {

}

....

}

不配置开发环境

没有webpack选项

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持码农之家。

webpack独立打包和缓存处理详解

前言

先前写了一篇webpack入门的文章《webpack入门必知必会》,简单介绍了webpack拆分、打包、压缩的使用方法。本文将在上篇文章的基础上进一步讲解在使用webpack构建的项目中存在的优化方案与解决方法。

上篇文章中写了一份webpack最基本的配置文件来打包压缩我们的代码:

var path = require('path');

module.exports = {

entry: './app/index.js',

output: {

filename: 'bundle.js',

path: path.resolve(__dirname, 'dist')

}

}

在入口文件index.js中我们引入了jQuery:

// index.js

var $ = require('jquery');

var str = require('./hello.js');

function main() {

$('body').html(str);

}

main();

这样我们虽然能够实现代码的统一打包,将jQuery、index.js、hello.js统统打包到了bundle.js里,但是会存在一个问题:每次打包都会生成一个体积较大的新bundle.js,浏览器无法缓存像jQuery这样的基本不会改动的框架库代码文件,影响加载速度。

发现问题我们就来解决问题,我们最终希望的是将像jQuery这样的框架库代码与项目自身的代码分开打包,生成一个独立的打包文件,缩减单个文件体积,浏览器也不用每次都进行加载。

步骤

1、独立打包

为了解决上述问题,我们需要修改我们的webpack配置文件:

var webpack = require('webpack');

var path = require('path');

module.exports = {

entry: {

main: './app/index.js',

vendor: ['jquery']

},

output: {

filename: '[name].js',

path: path.resolve(__dirname, 'dist')

},

plugins:[

new webpack.optimize.CommonsChunkPlugin({

name: 'vendor'

}),

]

}

上方我们将原本的单入口文件改成了多入口文件,并加入了vendor属性。vendor属性用于配置打包第三方类库,写入数组的类库名将统一打包到一个文件里。

同时我们将输出的filename用[name]变量来自动生成文件名,最后我们添加了一个CommonsChunkPlugin的插件,用于提取vendor。

配置完成后我们运行webpack命令:

Hash: ee1daf95c1986768927a

Version: webpack 2.3.2

Time: 573ms

Asset Size Chunks Chunk Names

main.js 340 bytes 0 [emitted] main

vendor.js 274 kB 1 [emitted] [big] vendor

[0] ./~/jquery/dist/jquery.js 267 kB {1} [built]

[1] ./app/hello.js 53 bytes {0} [built]

[2] ./app/index.js 114 bytes {0} [built]

[3] multi jquery 28 bytes {1} [built]

最终发现我们成功将jQuery打包到了vendor.js中,实现了独立打包,但是问题又来了:每次打包后生成的文件名都是一样的,浏览器可能缓存上一次的结果而无法加载最新数据。

2、添加hash

为了解决上述问题,我们需要为打包后的文件名添加hash值,这样每次修改后打包的文件hash值将改变,修改配置文件如下:

module.exports = {

...

output: {

filename: '[name].[chunkHash:5].js',

path: path.resolve(__dirname, 'dist')

},

...

}

上方我们在输出文件名中增加了[chunkHash:5]变量,表示打包后的文件中加入保留5位的hash值。我们再次运行打包命令:

Hash: c7d1295f2f9a27c412d2

Version: webpack 2.3.2

Time: 603ms

Asset Size Chunks Chunk Names

main.2a7ad.js 337 bytes 0 [emitted] main

vendor.49eb4.js 274 kB 1 [emitted] [big] vendor

[0] ./~/jquery/dist/jquery.js 267 kB {1} [built]

[1] ./app/hello.js 50 bytes {0} [built]

[2] ./app/index.js 114 bytes {0} [built]

[3] multi jquery 28 bytes {1} [built]

上方我们发现打包后的文件成功加上了hash值,这样每次修改文件后hash值也会跟着变,就不怕浏览器缓存了,但是当我们尝试去修改一个js文件后再次打包,问题又来了:vendor.js的hash值也变了,我们并没有修改jQuery的源码。

3、修改vendor配置

上述问题产生的原因是因为CommonsChunkPlugin插件是用于提取公共代码的,上方我们只是提取了vendor作为公共代码。为了继续解决上述问题,其实方法很简单,我们需要修改CommonsChunkPlugin的配置,如下:

module.exports = {

...

plugins:[

new webpack.optimize.CommonsChunkPlugin({

names: ['vendor', 'manifest']

}),

]

...

}

如此我们修改一下hello.js中的代码,发现vendor的hash值并未改变,并且多了一个manifest.js的小文件。manifest.js为webpack的启动文件代码,它会直接影响到hash值,用mainfest单独抽出来了,这样vendor的hash就不会变了。

4、生成index.html

通过以上对webpack配置文件的一系列修改,我们成功实现了webpack的独立打包与缓存处理,但是还差最后一步。

因为我们最终打包后生成的文件名中带有hash值,每次都是会变的,所以我们不能像目前这样在index.html中写死路径。

index.html

...

...

以上写法是不对的,因为缺少了可变的hash值,因此我们希望每次打包后index.html中的路径也会自动加上hash值,解决方法如下:

var HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {

...

plugins:[

...

new HtmlWebpackPlugin({

title: 'demo',

template: 'index.html' // 模板路径

}),

...

]

...

}

上方我们引入了html-webpack-plugin这一个插件,该插件可以帮助我们根据模板生成html文件。在plugins设置中,title配置了生成html中的title部分,template为模板html的路径地址。

我们需要下载html-webpack-plugin:

npm install html-webpack-plugin --save-dev

安装和配置完毕后,运行打包命令:webpack

Hash: 0c4b91e206579b31544d

Version: webpack 2.3.2

Time: 856ms

Asset Size Chunks Chunk Names

vendor.e1868.js 268 kB 0 [emitted] [big] vendor

main.44412.js 337 bytes 1 [emitted] main

manifest.ed186.js 5.81 kB 2 [emitted] manifest

index.html 292 bytes [emitted]

[0] ./~/jquery/dist/jquery.js 267 kB {0} [built]

[1] ./app/hello.js 50 bytes {1} [built]

[2] ./app/index.js 114 bytes {1} [built]

[3] multi jquery 28 bytes {0} [built]

我们发现在dist目录下生成了一个index.html文件,打开该文件后代码如下:

demo

至此我们实现了每次打包后index.html中的路径也会自动加上hash值的功能,因此dist目录下的index.html即为以后的首页文件,最后我们在浏览器中打开该文件成功显示:

结语

本文在webpack入门的基础上讲解了webpack独立打包与缓存处理的方式

实例代码已上传我的github,地址为:https://github.com/luozhihao/webpack-course/tree/master/vendor, 供参考。

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对码农之家的支持。

以上就是本次给大家分享的关于java的全部知识点内容总结,大家还可以在下方相关文章里找到相关文章进一步学习,感谢大家的阅读和支持。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值