我的Webpack实战

Posted by Yinode on Friday, November 24, 2017

TOC

关于Webpack

Webpack 是一个前端资源加载/打包工具。 它将根据模块的依赖关系进行静态分析,然后将这些模块按照指定的规则生成对应的静态资源。

一份基本的Webpack配置文件


const HtmlWebpackPlugin = require("html-webpack-plugin"); //模版生成文件
const path = require("path");
const ExtractTextPlugin = require("extract-text-webpack-plugin");
const BabiliPlugin = require('babili-webpack-plugin');
const OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin');

var HappyPack = require('happypack');


const PATHS = {
	app: path.join(__dirname,"app"),
	dist: path.join(__dirname,"dist")
}

const plugin = new ExtractTextPlugin({
	filename: 'css/[name].optimize.css',
	ignoreOrder: true
})

module.exports = {
    devServer: {
        host: process.env.HOST, // Defaults to `localhost`
        port: 80, // Defaults to 8080
        overlay: {
            errors: true,
            warnings: true,
        },
    }, //网页显示错误 端口设置
	entry: {
		app: PATHS.app+"/js",
	},
	output :{
		path: PATHS.dist,
		filename: "js/[name].js"
	},
	plugins: [
		new HtmlWebpackPlugin({
			title: "webpack demo",
			tmplete: "app/view/templete.html"
		}),
        plugin,
        new BabiliPlugin(), //js压缩
        new OptimizeCssAssetsPlugin({
            assetNameRegExp: /\.optimize\.css$/g,
            cssProcessor: require('cssnano'),
            cssProcessorOptions: { discardComments: {removeAll: true } },
            canPrint: true
        }), //css压缩
        new HappyPack({
            loaders: [ 'babel-loader?presets[]=es2015' ],
        })
	],
	module:{
		rules:[
			{
                test: /\.js$/,
                loader:'happypack/loader',
                 include: path.join(__dirname, "/app/js"),
                 exclude: path.join(__dirname, "/node_modules"), //加快编译速度
			},
			{
				test:/\.css$/,
                include: path.join(__dirname, "/app/css"),
                exclude: path.join(__dirname, "/node_modules"), //加快编译速度
				use: plugin.extract({
                    fallback: "style-loader", //在这里指定styleLoader 不要在use中
                    use: [{
                        loader: 'css-loader',
                        query:{
                            importLoaders : 1,
                            moudle:true
                        }
                    },'postcss-loader'],
				})
			},
            {
                test: /\.less$/,
                include: path.join(__dirname, "/app/css"),
                exclude: path.join(__dirname, "/node_modules"), //加快编译速度
                use: plugin.extract({
                    fallback: "style-loader", //在这里指定styleLoader 不要在use中
                    use: [{
                        loader: "css-loader" // translates CSS into CommonJS
                    }, 'postcss-loader',{
                        loader: "less-loader" // compiles Less to CSS
                    }]
                })
            },
            {
                test:/\.(png|jpg|jpeg|gif|svg)$/,
                include: path.join(__dirname, "/app/img"),
                exclude: path.join(__dirname, "/node_modules"), //加快编译速度
                use: 'url-loader?limit=8192&name=../images/[name].[ext]?[hash]'
            }
		]
	},
}

以上的配置是根据我自己的喜好和需求来进行的,并且我创建的两份,一份是上面的完整版,另一分删除了文件压缩功能,以求更方便的代码调试和快速的打包过程。

功能

我以我的这份配置来简单讲述一下webpack的功能

入口

webpack既然是一个打包工具,就需要一个入口,从这个入口顺藤摸瓜,找到所有用到的资源。可以配置多个入口

entry: {
    app: PATHS.app+"/js",
},

输出

output :{
        path: PATHS.dist,
        filename: "js/[name].js"
},

在设置了path之后,之后所有导出的东西都将会以这个为基础目录。 如果要设置下输出路径,需要在具体loader的filename设置

loader

loader是Webpack中一个核心的概念,我对它的理解就是给不同类型的文件做不同的处理,那么处理的工具就是Loader, 比如babel-loader就可以用来处理es6, less-loader可以处理less。

plugin

插件赋予了webpack更多更强大的功能,例如代码压缩,性能优化,自动生成HTML文件。

以上就是webpack配置文件的基本组成

常用启动参数

这方面我利用了npm的package.json来快速启动。 简述下基本用途


 "scripts": {
    "test": "echo \"Error: no test specified\", && exit 1",
    "build": "webpack --env production --config webpack.config.pro.js",
    "start": "webpack-dev-server --env development  --config webpack.config.dev.js",
    "status": "webpack --env production --config webpack.config.dev.js --profile --json > stats.json"
  },

  • build 用于文件的最终打包,生产环境,webpack.config.pro.js中有完整的打包,类似代码的压缩
  • start 用于工程的调试,开发环境,尽量以方便调试和快速打包为目的,利用WDS实现修改文件热刷新
  • status 用于生成打包json文件,可以用来进行可视化分析

install package


"devDependencies": {
    "autoprefixer": "^7.1.2",
    "babel-core": "^6.25.0",
    "babel-loader": "^7.1.1",
    "babel-preset-es2015": "^6.24.1",
    "babili-webpack-plugin": "^0.1.2",
    "css-loader": "^0.28.4",
    "eslint-loader": "^1.9.0",
    "extract-text-webpack-plugin": "^3.0.0",
    "file-loader": "^0.11.2",
    "happypack": "^4.0.0-beta.1",
    "html-webpack-plugin": "^2.30.1",
    "less": "^2.7.2",
    "less-loader": "^4.0.5",
    "optimize-css-assets-webpack-plugin": "^3.0.0",
    "postcss-loader": "^2.0.6",
    "style-loader": "^0.18.2",
    "url-loader": "^0.5.9",
    "webpack": "^3.4.1",
    "webpack-dev-server": "^2.6.1"
  }

功能及用到的package

具体的用法可以参考官方文档或者我的config,

  • dev下自动热刷新 webpack-dev-server
  • less处理 less-loader
  • es6编译打包 babel-loader
  • 样式文件处理(经lessloader编译后) style-loader 和 css-loader
  • css压缩 optimize-css-assets-webpack-plugin
  • 将嵌入到js中的文件剥离为独立的css文件 extract-text-webpack-plugin
  • 打包多线程优化 happypack
  • 自动生成HTML文件并自动引入资源 html-webpack-plugin
  • css自动加兼容性前缀 postcss-loader
  • 图片处理小图>base64 大图src url-loader file-loader

多页面可以再入口中设置多个入口

一些比较高级的用法

模块热加载

多页面配置

利用模版语法让生成的HTML变得更加只能,比如访问当前页面的name并导入不同的script css

总结

Webpack与gulp相比能做的事情有些类似,但是webpack毫无疑问是更加贴近实际的需求的,gulp机械感会更强一些。而webpack它更像是一个从前端流程角度去思考问题解决问题的工具。

DEMO地址 https://github.com/zhangzhengyi12/WebpackDemo