webapck-基础学习


webpack的基本使用

entry

​ 指定webpack打包的入口,可以是单入口也可以是多入口

// 单入口
{
  entry: '/xxx/xx.js'
}
// 多入口
{
  entry: {
    index: '/xxx/xx.js',
    search: '/xxx/xx.js'
  }
}

output

​ 指定打包文件输出路径,需要指定文件名和路径,只能指定一个路径

{
  output: {
    path: 'dist',
    filename: 'bundle.js' // 如果是多入口,可以使用[name].js
  }
}

plugins

{
  plugins: ['插件']
}

loader

module: {
  rules:[
    {
      test: '/\.jsx$/', // 匹配什么类型的文件
      use: '', // 使用对应的modiles解析
    }
    ]
}

mode

提供 production、none 和 development三个选项,使用不同的选项可以开启不同的优化

具体是什么优化?

不同文件的打包

webpack默认只支持js和json的打包

es6

​ babel-loader解析

​ @babel/core @bable/preset-env

​ 需要在根目录的.bablerc文件类使用

{
  "presets": [
      "@babel/preset-env" // 解析es6
  ]
}

jsx

​ .babelrc添加对react的解析

{
  "presets": [
      "@babel/preset-react" // 解析react
  ]
}

css、less、sass解析

​ 将css解析成commonjs对象,然后插入到js的head,需要使用 css-loader: 用于解析css 、style-loader: 通过style样式插入到head中(不是单独一个文件)。

他们之间存在顺序调用,从右向左

module: {
  rules: [
    {
      test: /\.css$/,
      use: ['styale-loader', 'css-loader']
    }
  ]
}

图片、字体

​ 使用file-loader解析

​ url-loader –> base64????

文件监听

启动是时候命令行加上 –watch or 在配置里面添加 watch: true

调用nodejs fs模块检测文件内容有没有改变

{
    watch: true;
    watchOptions: {
        ingore: /node_modules/, // 不监听的文件
        aggregateTimeout: 300, // 检查到变化后多久执行重新打包
        poll: 1000, // 隔多久检查
    }
}

热更新

​ HMR: hot module replacement —> bundle server

​ WDS: webpack dev server —> HMR server 、HRM Runtime

HMR 和 WDS配和使用: WDS提供链接访问资源的方法,HMR 实现了热更新的功能,检测到文件变化,就可以更新

HMR 与 watch的区别

​ 存放位置不一样: HMR输出的文件放在内存中

​ 不需要刷新浏览器

HMR的原理

​ HMR server 服务端监听变化,通过ws将变化传给客服端(浏览器) HRM Runtime

问题:

存在多个入口,文件进行了热替换,但是浏览器显示没有刷新,需要手动更新

​ 解决办法:

 devServer: {
    static:[path.join(__dirname, 'dist')],
    compress: true,
    hot: false, // 把这个置为false
    port: 9000,
  },

​ Please set webpack/webpack-dev-server#2792 (comment), because you have multiple entries on the same page

​ 参考连接: https://github.com/webpack/webpack/issues/15988

wds 启动不会生成dist文件夹

https://segmentfault.com/q/1010000009393240

热更新会全部更新???

文件后缀hash

hash

contentHash

chunkHash 没办法和hrm一起使用?

代码混淆(压缩)

css压缩

js压缩

​ 打包的js文件已经压缩过了,webpack v5 开箱即带有最新版本的 terser-webpack-plugin

https://webpack.docschina.org/plugins/terser-webpack-plugin/

html压缩

​ 使用 html-webpack-plugin,生成一个html5文件,在 body 中使用 script 标签引入你所有 webpack 生成的 bundle。

​ 参数说明: https://github.com/jantimon/html-webpack-plugin#options

new HtmlWebpackPlugin({
      template: path.join(__dirname, 'src/search.html'),
      filename: 'search.html',
      chunks: ['search'], // 需要引入的chunk
      inject: true, // 注入css js资源
      minify: {
          html5: true,
          collapseWhitespace: true,
          preserveLineBreaks: false,
          minifyCSS: true,
          minifyJS: true,
          removeComments: false
      }
    })  

文章作者: 木叶勇
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 木叶勇 !
  目录