原文地址:https://github.com/huruji/blog/issues/3javascript
单文件入口
指定entry键值css
const config = { entry: './yourpath/file.js' }; module.exports = config
上面的是如下的简写:html
const config = { entry: { main: './yourpath/file.js' } }; module.exports = config
多文件入口
对entry采用对象写法,指定对应的键值对,为了输出这多个文件可使用占位符java
const path = require('path'); const config = { entry: { app1: './src/main.js', app2: './src/app.js' }, output: { filename: '[name].bundle.js', path: path.join(__dirname, 'dist') } }; module.exports = config;
指定打包构建以后输出的文件
单文件输出
指定output键值,值为对象,对象中指定path和filenamereact
const path = require('path'); const config = { output: { filename: 'bundle.js', path: path.join(__dirname, 'dist') } }; module.exports = config;
多文件输出
使用占位符,输出文件将按照多文件入口指定的键来替代占位符webpack
const path = require('path'); const config = { entry: { app1: './src/main.js', app2: './src/app.js' }, output: { filename: '[name].bundle.js', path: path.join(__dirname, 'dist') } }; module.exports = config;
Loader能够在加载模块时预处理文件,相似于gulp中的task。配置loader须要在module选项下指定对应后缀名相应的rules,使用test正则指定后缀名,使用use指定相应的loadergit
容许在js中import css
须要使用style-loader和css-loader,首先须要安装:github
npm i css-loader style-loader --save-dev
使用loaderweb
const path = require('path'); const config = { entry: './src/main.js', output: { filename: 'bundle.js', path: path.join(__dirname, 'dist') }, module: { rules: [{ test: /\.css$/, use: [ 'style-loader', 'css-loader' ] }] } }; module.exports = config;
模块文件写法:npm
import './css/main.css'
容许加载图片
须要使用file-loader,首先安装:
npm i file-loader --save-dev
使用:
const path = require('path'); const config = { entry: './src/main.js', output: { filename: 'bundle.js', path: path.join(__dirname, 'dist') }, module: { rules: [{ test: /\.(png|jpg|svg|gif)$/, use: [ 'file-loader' ] }] } }; module.exports = config;
模块文件写法:
import logo from './image/logo.svg';
插件的目的在于解决loader解决不了的事情,使用插件指定plugins选项便可,须要注意的使用插件须要引入插件。如使用HtmlWebpackPlugin插件为咱们自动生成一个html文件。
首先安装:
npm i --save-dev html-webpack-plugin
配置webpack
const path = require('path'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const config = { entry: './src/main.js', output: { filename: 'bundle.js', path: path.join(__dirname, 'dist') }, module: { rules: [{ test: /\.css$/, use: [ 'style-loader', 'css-loader' ] },{ test: /\.(png|jpg|svg|gif)$/, use: [ 'file-loader' ] }] }, plugins: [ new HtmlWebpackPlugin({ title: '个人webpack' }) ] }; module.exports = config;
源代码被webpack打包以后,会很难追踪到原始的代码的位置,使用source map功能,能够将编译后的代码映射回原始代码位置,指定devtool选项便可:
const config = { // .... devtool: 'inline-source-map' }; module.exports = config;
webpack-dev-server提供了一个简单的web服务器,并可以实时从新加载使用webpack须要先安装:
npm i --save-dev webpack-dev-server
在配置文件中指定devServer选项,告诉服务器在哪里寻找文件
const config = { // .... devServer: { contentBase: './dist' } }; module.exports = config;
使用命令行运行命令或者在package.json中指定scripts
webpack-dev-server --open
此时服务将运行在8080端口,其中open选项表示服务开启以后当即在默认浏览器中打开页面。
开启热更新很简单,只须要更新webpack-dev-server配置,增长hot选项,同时使用webpack自带的HMR插件
const config = { // .... devServer: { contentBase: './dist', hot:true }, plugins: [ new webpack.HotModuleReplacementPlugin() ] }; module.exports = config;
在实际中是开发中可能有些模块的方法并无被使用,也就是说,在开发中这些方法并无被import,这些没有被使用的代码应该被删除的,使用uglifyjs-webpack-plugin插件能够帮助咱们删除这些代码,同时作代码混淆和压缩。
安装:
npm i -D uglifyjf-webpack-plugin
使用:
const UglifyJSPlugin = require('uglifyjs-webpack-plugin') const config = { // .... plugins: [ new UglifyJSPlugin() ] }; module.exports = config;
生产和开发中的构建确定是不一样,生产中侧重于一个更好的开发体验,而生产环境中则须要更多的性能优化,更小的chunk。webpakck能够指定命令运行以来的配置文件,经过在package.json中写入script是一种不错的方式。而生产和开发中的配置确定有不少重复的地方,使用webpack-merge能够合并通用配置
安装:
npm i -D webpack-merge
webpack.common.js
const path = require('path'); const CleanWebpackPlugin = require('clean-webpack-plugin'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const config = { entry: './src/main.js', plugins: [ new CleanWebpackPlugin(['dist']), new HtmlWebpackPlugin({ title: 'My App' }) ], output: { filename: 'bundle.js', path: path.join(__dirname, 'dist') }, } module.exports = config;
webpack.dev.js
const merge = require('webpack-merge'); const common = require('./webpack.common'); const config = merge(common, { devtool: 'inline-source-map', devServer: { contentBase: './dist' } }); module.exports = config;
webpack.prod.js
const merge = require('webpack-merge'); const UglifyJSPlugin = require('uglifyjs-webpack-plugin'); const common = require('./webpack.common'); const config = merge(common, { plugins: [ new UglifyJSPlugin() ] }); module.exports = config;
package.json
{ // ...... "scripts": { "start": "webpack-dev-server --open --config webpack.dev.js", "build": "webpack --config webpack.prod.js" }, // ...... }
许多lib经过与process.env.NODE_ENV环境关联来决定lib中使用哪些内容,使用webpack内置的DefinePlugin能够为全部依赖指定这个变量。
const config = { // ...... plugins: [ new webpack.DefinePlugin({ 'process.env': { 'MODE_ENV': JSON.stringify('production') } }) ] // ...... }
让文件名带有hash能够方便在生产环境中用户及时更新缓存,让文件名带有hash可使用和构建相关的[hash]占位符,也可使用与chunk相关的[chunkhash]占位符,一般后一种是更好的选择
const config = { //...... output: { filename: [name].[chunkhash].js, path: path.join(__dirname, 'dist') } // ...... }
在开发中有些时候咱们须要webpack不打包某些lib,这在咱们开发lib的时候特别常见,好比咱们为react开发插件,不但愿打包的时候包含react。使用配置的external选项能够作到,
const config = { "externals": [ "react", "react-dom" ] }