Webpack打包

138 阅读2分钟

ES6 Module

1.像我们常用的<script>的方式在html中去引入Js文件,这些文件中定义的变量,其实是定义在全局作用域中的。

2.像我们使用es6,module。一个module就是一个文件,但module里定义的变量是私有的,除非用export暴露出去,否则外面访问不到。最初,我们用<script>的方式来做前端模块儿化,可想而知,全局环境会被污染的很严重,module的这种设计就是为了避免这个问题。

3.像我们用module,通过webpack把几个文件打包到一个文件中,变量会相互干扰嘛?打包后的bundle.js实际上就是一个立即执行函数,会有一个modules对象,对象key是每个文件的路径,value是一个函数(模块函数,执行模块里的内容的)。所以说module里的变量实际是放在函数里面了,这也比较合理,毕竟js除了全局作用域就只有函数作用域了嘛。

三种hash

  • hash :全局hash,每次打包对应一个新的hash值,所以哪怕更新一个文件,打包后所有的文件名都会变。
  • chunkhash:分组hash,一个入口对应的一系列文件为一组同一个hash,这组中有文件改动,打包后这组文件hash更新,其他组的不变。
  • contenthash :内容hash,根据自身文件内容生成的hash值,自己内容不变,hash不变。

module、chunk、bundle的区别

image.png

module,chunk 和 bundle 其实就是同一份逻辑代码在不同转换场景下的取了三个名字。

一般来说一个 chunk 对应一个 bundle,但也有例外,例如上图我们可以从chunks0中抽离出css文件。

我们直接写出来的是 module,webpack 处理时是 chunk,最后生成浏览器可以直接运行的 bundle。