一、Webpack和gulp/grunt对比
1、Gulp和Grunt
Grunt和Gulp的工作方式是:在一个配置文件中,指明对某些文件进行类似编 译,组合,压缩等任务的具体步骤,工具之后可以自动替你完成这些任务。
Grunt 弊端:
是基于文件流的(读到内存,替换),随着项目膨胀,会越来越慢,越来越复杂。
Gulp:
实现了grunt一样的功能。
优点:
- 基于流式的。
不是通过目录去复制每一个文件。直接处理二进制。
- 配置简单。
缺点:满足不了前端发展的需求:懒加载,模块拆分,react中trunk的。
2、webpack
Grunt和Gulp:任务管理器。——前端自动化
WebPack:模块打包器。
无法替代的优势:工程化和模块化。
二、WebPack使用
安装:
pm i -D webpack@3.10.0
sudo npm i -D webpack@3.10.0 --registry=https://registry.npm.taobao.org
webpack.config.js用的是commonjs的模块式语法。【webpack4.0之后可以不用配:webpack.config.js】
可以直接加上哈希。
const path = require('path'); module.exports = { entry: './src/index.js', output: { path: path.resolve(__dirname, 'dist'), filename: 'bundle-[hash].js' } };
每次生成的文件不一样。
两个模块合并压缩生成了一个文件,文件中加入了webpack的模块管理语法。
执行:
webpack
webpack webpack.config.js
真正开发中,会建一个文件夹,全部配置写到config文件夹中。
const path = require('path'); const version=require('./version'); module.exports = { entry: './src/index.js', output: { path: path.resolve(__dirname, 'dist'), filename: 'bundle-[hash].js' } };
学习资料推荐:
https://webpack.js.org/concepts/
三大功能:
- 输入输出
- 加载器 loaders,【可以理解为插件】
module: { rules: [ { test: /.css$/, use: [ { loader: 'style-loader' }, { loader: 'css-loader', options: { modules: true } } ] } ] }
热加载机制,借助插件API
常规的webpack配置实现参考
webpack.config.js
const path = require('path'); const HTMLPlugin = require('html-webpack-plugin'); const webpack = require('webpack'); const ExtractPlugin = require('extract-text-webpack-plugin'); const isDev = process.env.NODE_ENV === 'development'; const config = { target: 'web', entry: path.join(__dirname, 'src/index.js'), // 输入:项目主文件(入口文件) output: { // 输出 filename: 'build.[hash:8].js', // 输出的文件名 path: path.join(__dirname, 'dist') // 输出路径 }, module: { // 配置加载资源 rules: [ // 规则 { test: /.vue$/, loader: 'vue-loader' }, { test: /.jsx$/, loader: 'babel-loader' }, { test: /.(gif|jpg|jpeg|png|svg)$/, use: [ { loader: 'url-loader', options: { limit: 1024, // 文件小于1024字节,转换成base64编码,写入文件里面 name: '[name]-output.[ext]' } } ] } ] }, // webpack插件配置 plugins: [ new webpack.DefinePlugin({ 'process.env': { NODE_ENV: isDev ? '"development"' : '"production"' } }), new HTMLPlugin() ] }; if (isDev) { // 开发坏境的配置 config.module.rules.push({ test: /.styl/, use: [ 'style-loader', 'css-loader', { loader: 'postcss-loader', options: { sourceMap: true } }, 'stylus-loader' ] }); config.devtool = '#cheap-module-eval-source-map'; config.devServer = { port: '8888', host: '127.0.0.1', overlay: { // webpack编译出现错误,则显示到网页上 errors: true, }, // open: true, // 不刷新热加载数据 hot: true }; config.plugins.push( new webpack.HotModuleReplacementPlugin(), new webpack.NoEmitOnErrorsPlugin() ) } else { // 生成坏境的配置 config.entry = { // 将所用到的类库单独打包 app: path.join(__dirname, 'src/index.js'), vendor: ['vue'] }; config.output.filename = '[name].[chunkhash:8].js'; config.module.rules.push({ test: /.styl/, use: ExtractPlugin.extract({ fallback: 'style-loader', use: [ 'css-loader', { loader: 'postcss-loader', options: { sourceMap: true } }, 'stylus-loader' ] }) }); config.plugins.push( new ExtractPlugin('styles.[contentHash:8].css'), // // 将类库文件单独打包出来 // new webpack.optimize.CommonsChunkPlugin({ // name: 'vendor' // }) // webpack相关的代码单独打包 // new webpack.optimize.CommonsChunkPlugin({ // name: 'runtime' // }) ); config.optimization = { splitChunks: { cacheGroups: { // 这里开始设置缓存的 chunks commons: { chunks: 'initial', // 必须三选一: "initial" | "all" | "async"(默认就是异步) minSize: 0, // 最小尺寸,默认0, minChunks: 2, // 最小 chunk ,默认1 maxInitialRequests: 5 // 最大初始化请求书,默认1 }, vendor: { test: /node_modules/, // 正则规则验证,如果符合就提取 chunk chunks: 'initial', // 必须三选一: "initial" | "all" | "async"(默认就是异步) name: 'vendor', // 要缓存的 分隔出来的 chunk 名称 priority: 10, // 缓存组优先级 enforce: true } } }, runtimeChunk: true } } module.exports = config;
不推荐:
webpack --module-bind jade-loader --module-bind 'css=style-loader!css-loader'
全局安装问题:
不同的工程用不同的版本。有些配置上的差别,建议本地安装。
直接运行webpack遇到的问题:
$ webpack webpack.config.js
bash: webpack: command not found
node_modules/.bin/webpack
我一般都是自定义shell命令来操作的。
$ alias lwebpack="node_modules/.bin/webpack"
本文作者starof,因知识本身在变化,作者也在不断学习成长,文章内容也不定时更新,为避免误导读者,方便追根溯源,请诸位转载注明出处:https://www.cnblogs.com/starof/p/9062560.html 有问题欢迎与我讨论,共同进步。