webpack4.29.x成神之路(四) entry与output

目录jquery

上节: 基本配置与mode
目录结构以下:webpack

clipboard.png

本节将重点讲解entry和output的经常使用配置。web

1、entry

先跟新webpack.config.js,将output删除:
webpack.config.js:npm

module.exports = {
  mode: 'production',
  entry: './src/index.js'
};

而后执行:npm run buildsegmentfault

clipboard.png

在根目录下生成了dist目录,而且打包后的文件名为main.js。
那么问题来了,这个文件名是依据什么生成的呢?浏览器

复制一份src下的index.js, 并更名为main.js:缓存

clipboard.png

修改配置文件,增长一个入口
webpack.config.js:ui

module.exports = {
  mode: 'production',
  entry: {
    index: './src/index.js',
    main: './src/main.js'
  }
};

而后 npm run buildspa

在生成的dist文件夹中,就会有两个js文件,main.js和index.js。
因此能够初步认为,打包后的文件名默认等于入口文件的名称,也就是entry的key值
这个key值在webpack中设定为入口文件的 [name]和[id].3d

clipboard.png

以前的这种写法:

entry: './src/index.js'

至关于:

entry: {
  main: './src/index.js'
}

2、output

先将刚才打包dist目录和src下的main.js删除

clipboard.png

增长出口配置:
webpack.config.js:

module.exports = {
  mode: 'production',
  entry: './src/index.js',
  output: {
    filename: 'bundle.js'
  }
};

执行npm run build
此时dist目录下生成的文件名为bundle.js

输出的文件名默认取entry的key值,也能够经过filename修改。

也就是说,filename的默认配置是:

module.exports = {
  mode: 'production',
  entry: './src/index.js',
  output: {
    filename: '[name].js'    // 同[id].js
  }
};

filename能够自由组合:

module.exports = {
  mode: 'production',
  entry: './src/index.js',
  output: {
    filename: '[name].bundle.js'    // main.bundle.js
  }
};

也能够经过filename改变文件的存放路径,好比将文件打包放入入js文件夹中
webpack.config.js:

module.exports = {
  mode: 'production',
  entry: './src/index.js',
  output: {
    filename: 'js/[name].bundle.js'
  }
};

而后 npm run build
main.bundle.js就会在dist/js 下。

clipboard.png

hash、chunkhash与contenthash

为了利用浏览器缓存的特性,咱们一般但愿只要文件内容有变化,就生成不一样的文件名,用hash就能实现这个需求

hash

每次修改任何一个文件,全部文件名的hash至都将改变。因此一旦修改了任何一个文件,整个项目的文件缓存都将失效
配置以下:

webpack.config.js:

module.exports = {
  mode: 'production',
  entry: './src/index.js',
  output: {
    filename: '[name].[hash].js'
  }
};

而后 npm run build
生成的文件名以下:

clipboard.png

这样只要入口文件(index.js)改变,每次打包生成的hash都不一样。
也能够限制hash长度:

webpack.config.js:

module.exports = {
  mode: 'production',
  entry: './src/index.js',
  output: {
    filename: '[name].[hash:8].js'
  }
};

npm run build后的文件名以下:

clipboard.png

chunkhash

在项目中有许多代码是基本不变的,好比第三方库jquery、lodash等,这些代码将被单独拆分出来生成单独的文件,这就是所谓的chunk。
这里涉及到代码分割相关内容,暂时了解便可,后续会详细讲到。

使用示例:
webpack.config.js:

module.exports = {
  mode: 'production',
  entry: './src/index.js',
  output: {
    filename: '[name].[chunkhash:8].js'
  }
};

contenthash

contenthash是针对文件内容的,只更新内容有变化的入口文件的hash值
如今新增一个入口,复制index.js并更名为main.js

clipboard.png

src/main.js和src/index.js内容以下

window.addEventListener('DOMContentLoaded', function() {
  const root = document.getElementById('root');
  root.innerHTML = _.join(['Hello', 'webpack'], ' ');
});

使用contenthash
webpack.config.js:

module.exports = {
  mode: 'production',
  entry: {
    index: './src/index.js',
    main: './src/main.js'
  },
  output: {
    filename: '[name].[contenthash:8].js'
  }
};

npm run build 打包生成以下:

clipboard.png

而后修改src/main.js:

window.addEventListener('DOMContentLoaded', function() {
  const root = document.getElementById('root');
  root.innerHTML = _.join(['webpack4', 'is', 'powerful'], ' ');
});

再次打包:

clipboard.png

能够看到只改变了main.js的hash值。因此contenthash也是推荐使用的

path

默认的输出目录是dist文件夹,能够经过path属性修改,
path建议设置绝对路径,好比将打包后的代码放在bundles目录下
webpack.config.js:

const { resolve } = require('path');

module.exports = {
  mode: 'production',
  entry: {
    index: './src/index.js',
    main: './src/main.js'
  },
  output: {
    filename: '[name].[contenthash:8].js',
    path: resolve(__dirname, 'bundles')
  }
};

npm run build, 这样就会代码就会放在bundles目录了

clipboard.png

下节:使用plugins

相关文章
相关标签/搜索