webpack.config.js

1.webpack.config.js 和vue.config.js有什么区别

1.1 webpack.config.js是webpack的配置文件,所有使用webpack作为打包工具的项目都可以使用,vue的项目可以使用,react的项目也可以使用。
1.2 vue.config.js是vue项目的配置文件,专用于vue项目。通过vue.config.js中常用功能的配置,简化了配置工作,当然如果需要更专业的配置工作,webpack.config.js和vue.config.js在vue项目中是可以并存的。

2.webpack.config.js 文件内容

2.1文件的入口,出口(entry可以是字符串,是数组或对象,入口可以有多个,出口只能有一个)
module.exports = {
    entry: './src/main.js', //打包文件入口
    output: {               //打包文件出口
        path: './dist',
        filename: 'bundle.js'
    }
}
2.2 loader( 可以使你在 import 或 "load(加载)" 模块时预处理文件)loader 可以将文件从不同的语言(如 TypeScript)转换为 JavaScript 或将内联图像转换为 data URL。loader 甚至允许你直接在 JavaScript 模块中 import CSS 文件!

webpack 只能理解 JavaScript 和 JSON 文件,这是 webpack 开箱可用的自带能力。loader 让 webpack 能够去处理其他类型的文件,并将它们转换为有效 [模块]以供应用程序使用,以及被添加到依赖图中。
例如:加载css文件 ----- css-loader
将ts转为js ----- ts-loader

module.exports = {
 module: {
   rules: [
     { test: /\.css$/, use: 'css-loader' },
     { test: /\.ts$/, use: 'ts-loader' },
   ],
 },
};
2.3 plugins 插件

html-webpack-plugin

  功能:把打包好的文件自动引入到入口文件 index.html 文件中
  安装:npm install html-webpack-plugin -D
  在 webpack.config.js 中引入
  const HtmlWebpackPlugin = require('html-webpack-plugin');
  // 配置
  plugins:[
    new HtmlWebpackPlugin({
      // 默许指定 模板的路径 否则会篡改网页 title
      template: resolve('public/index.html')
    })
  ]

可以动态的引入js,因为每次打包后的js hash值可能不一样,它可以根据具体的hash值,引入js

const HtmlWebpackPlugin = require("html-webpack-plugin")

  plugins: [
    new HtmlWebpackPlugin({
      template: 'index.html',
      title: 'czklove',
      filename: 'index.html',
      chunks: '[name].bundle[hash].js'
    })
  ]

clean-webpack-plugin

  功能:在每次打包时,先删除上次生成的文件
  安装:npm install clean-webpack-plugin -D
  在 webpack.config.js 中引入
  const CleanWebpakPlugin = require('clean-webpack-plugin');
  // 配置
  plugins:[
    new HtmlWebpackPlugin({
      // 默许指定 模板的路径 否则会篡改网页 title
      template: resolve('public/index.html')
    }),
    // 必须指定路径,是数组,可指定多个路径
    new CleanWebpakPlugin(['dist'])
  ]

HotModuleReplacementPlugin 模块热替换插件
webpack 内置插件,可以简单配置就能用。功能,就是提供保存后,页面刷新修改内容

new webpack.HotModuleReplacementPlugin()

uglifyjs-webpack-plugin 压缩插件 开启js,css压缩

    new UglifyJsPlugin({
       test:/\.js$|\.html$.\css/, //匹配文件名
       threshold:10240,//对超过10K的数据进行压缩
       deleteOriginalAssets:false,//不删除源文件
    }),

最最重要的插件,SplitChunksPlugin ,代码分割插件

optimization: {
    splitChunks: {
      chunks: 'initial', // 分割方式 :"initial" 初始化,"all"(默认就是all),"async"(动态加载)
      minSize: 30000,// 形成一个新代码块最小的体积,只有 >= minSize 的bundle会被拆分出来
      minChunks: 1, //引入次数,如果为2 那么一个资源最少被引用两次才可以被拆分出来
      maxAsyncRequests: 5, // 按需加载的最大并行请求数
      maxInitialRequests: 3, // 一个入口最大并行请求数
      automaticNameDelimiter: '~', // 分割后的名字用什么符号链接,文件名的连接符
      name: true,
      cacheGroups: { //缓存组
        venxx: {
          test: /vue/,
          name: 'vuevendors'
        },
        vendors: {
          test: /jquery/,
          name: 'jqueryvendors'
        }
      }
    }
  }

主要用途
1.做代码分割,默认是将所以的异步引入单独打包,如常见的Vue异步路由组件
2.将不常改变的模块代码单独打包,这样更有利于浏览器的缓存处理,如将vue vuex vue-router, ui库,这些都是不常改变
3.将业务代码单独打包,这是经常改变的
4.异步模块代码单独打包,做预加载处理,加快首页加载速度
如果项目过大,打包事件过长,可以考虑使用HappyPack 插件,开启多进程打包(不是多线程,js是单线程的)

plugins: [
      new HappyPack({
        id: 'babel', // 与loader 配置项对应
        threads: 4, // 开启多少个进程
        loaders: ['babel-loader'] //用什么loader处理
      })
    ]

all: 不管文件是动态还是非动态载入,统一将文件分离。当页面首次载入会引入所有的包
async: 将异步加载的文件分离,首次一般不引入,到需要异步引入的组件才会引入。
initial:将异步和非异步的文件分离,如果一个文件被异步引入也被非异步引入,那它会被打包两次(注意和all区别),用于分离页面首次需要加载的包。

2.4 resolve

自动解析确定的扩展。默认值为:

module.exports = {
  //...
  resolve: {
    extensions: ['.wasm', '.mjs', '.js', '.json']
  }
}

能够使用户在引入模块时不带扩展:

import File from '../path/to/file';

如果你想要添加一个目录到模块搜索目录,此目录优先于 node_modules/ 搜索:
如下配置会导致webpack在查找模块时候,先去src目录下找,如果没有找到会去node_modules下查找

module.exports = {
  //...
  resolve: {
    modules: [path.resolve(__dirname, 'src'), 'node_modules']
  }
};
2.5 externals

当我们想在项目中require一些其他的类库或者API,而又不想让这些类库的源码被构建到运行时文件中,这在实际开发中很有必要。此时我们就可以通过配置externals参数来解决这个问题:

 externals: {
     "jquery": "jQuery"
 }

这样我们就可以放心的在项目中使用这些API了:var jQuery = require(“jquery”);

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容