You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
module.exports={newwebpack.DefinePlugin({'process.env' : {'NODE_ENV': JSON.stringify('development')}})}// src下的index.jsif(process.env.NODE_ENV!=='production'){console.log('Looks like we are in development mode!');}
//print.jsexportdefault()=>{console.log('This is a print')}// index.jsfunctionget(){// print.js里面没有依赖,有依赖的话需要写在[]中。button.onclick=e=>require.ensure([],()=>{letprint=require('print');print()},'print');}
webpack文档高级配置
主要从下面几个方面讲解:
webpack的生产配置构建
在开发一个项目的时候,我们往往需要几个环境的切换,例如:开发(dev),生产(production), 测试(test),这里主要讲解开发和生产中的环境配置,
webpack
官方推荐我们将公共的基本配置放在一起,然后对开发和生产进行不同的配置文件,通过官方提供的插件webpack-merge
进行配置的合并,然后通过webpack编译生产。生产环境使用环境变量
当然这些只是配置文件,如果我们想在配置文件中使用
环境变量
(process.env.NODE_ENV
)进行不同情况下面的判定,我们可以通过npm script
进行环境变量的配置。windows下要获取环境变量需要使用一个包插件cross-env
一般情况下,我们已经区分了不同的环境下面的不同的webpack配置文件,所以很少通过这样配置环境变量,但是更多的是,我们在源文件中通过不同的环境参数进行不同的判定。但是当开启的是
webpack-dev-server --open
的时候,不能获取环境变量。源文件中使用环境变量
webpack提供自带插件
webpack.DefinePlugin()
来给源文件来配置环境变量。这样我可以在源文件中根据不同的环境变量来编写不同的代码,也可以通过环境变量来提示用户信息。
webpack的优化机制
由于JS模块化的的兴起,前端代码从以前的一个大文件变成了一块块的代码,对于每一个模块的引用和使用就是一个问题了,总结由于模块化需要注意的问题。
带着上面的四个问题,我们来探究一下webpack的优化机制。
1. 解决模块重复引用的问题
对于**多个入口
chunk
**的重复应用一个模块的情况下。现在我们有三个模块
a.js, b.js index.js
对于模块
a.js
, 我们需要在其他的2个模块中使用,webpack打包的时候,就会重复打包a.js
, 这样就加大了文件的大小和负担,有没有一种方法可以提前把a.js
存放起来,当我们在使用的时候,直接去调用就行了。webpack
官方也考虑了这种情况,提供了一个自带的插件webpack.optimize.CommonsChunkPlugin
来处理这种情况。注意的是,options.name
不要和entry的name重合,不然会被认为第三方模块被分离。2. 解决内部模块和第三方模块的分离
由于模块化的好处,我们可以很轻松的使用第三方别人写好的模块,加速我们的代码编写,但是也不方便我们进行维护和进一步的拓展,所有有必要把第三方模块和自己的模块进行分离。
CommonsChunkPlugin()
提供了我们分离第三方模块的使用。通过entry
里面指定对于的name
,然后分离代码。3. 利用缓存技术处理第三方修改很少的模块
我们一般在写输出文件的时候,都会利用hash值,让客户端(浏览器)实时更新我们的修改代码,不会走缓存,但是当使用第三方修改很少的模块的时候,我们恰恰需要利用浏览器的缓存,来减少服务器请求,优化页面。
webpack
一般使用chunkhash
来改变文件的hash
值按照上面的写法,当我们
npm run build
的时候,会出现这样的结果,浏览器请求这些js
文件的时候我们想的是,可以通过某个技术然后让我们在修改内部代码的时候,
vendor[hash].build.js
的值不改变,这样浏览器就可以利用缓存,不用重复请求了。CommonsChunkPlugin
有一个较少有人知道的功能是,能够在每次修改后的构建结果中,将 webpack 的样板(boilerplate)和 manifest 提取出来。通过指定entry
配置中未用到的名称,此插件会自动将我们需要的内容提取到单独的包中。然后就可以通过manifest内部机制,跳过vendor
的hash值的改变。这样配置了后,我们再次修改后,第三方模块的文件名是不会更新的,这样我们可以只修改我们内部代码,然后重新打包后,可以不改变第三方模块的打包文件名,很好的利用浏览器的缓存。
4. 按需加载,减少首页的文件请求压力
浏览器加载首页的时候,如果我们把js文件全部都已经打包好,并且全部放在首页加载的话,就会增大请求,从而首页加载的时间也会增加。可不可以我们点击某个按钮或者交互的时候,加载我们需要的部分,而不是在首页全部加载,这样就可以是实现按需加载,从而减少首页请求服务器和时间。
webpack提供2中方式实现按需加载
import
加载 (官网推荐使用这种方式加载)import()
加载模块后返回一个promise
,得到一个对象,其中default
属性会是加载模块导出的内容。注释的webpackChunkName:name
配合output.chunkFilename:[name].js
会变成打包后的文件名。交互点击后:我们发现才加载已经打包好了的print.bundle.js
require.ensure(dependencies, callback,filename)
总结:
import
方式和require.ensure
决定了什么时候加载打包后的模块,webpackChunkName:name
和filename
配合webpack
的输出配置output.chunkFilename
控制文件打包后的文件名。webpack的部分插件
上面的部分我们已经使用了很多的插件,这里总结一下一些常见的插件
plugins
webpack
通过options.plugins: []
来配置相应的插件特性。webpack自带插件
CommonsChunksPlugin
插件使用方法:
使用用途:
DefinePlugin插件
在使用DefinePlugin之后,我们可以在源文件内部是用配置好的全局环境变量,为什么这样做呢?可以区分开发模式和发布模式。用过node的同学知道,
process.env
可以获取环境变量。这里沿用了node的。注意区分构建文件webpack.config.js
和源文件index.js
使用方法:
使用用途:
providePlugin插件
提供全局变量,我们不用在全局的去引用这个全局变量。webpack会自动记载模块。
使用方法:
使用说明:
$
的时候,webpack都会自动加载模块jquery,并且$会被jquery的输出的内容所赋值。export default
必须指定模块的default
属性。例如:Vue
lodash
其他插件
extractTextWebpackPlugin插件
用于把css内部样式提取成css单独文件。对于复杂的样式很有用。
使用方法:
详细查看webpack插件
html-webpack-plugin插件
用于生成单独的html文件,并自动引入打包后的文件。如果有多个入口文件,也会生成多个
index.htm
l文件使用方法:
详细查看webpack插件
UglifyjsWebpackPlugin
可以在webpack打包后,压缩文件,减少文件的大小。
使用方法:
使用说明:
include
exclude
test
source map
的配置,映射错误信息。The text was updated successfully, but these errors were encountered: