webpack配置
来源:互联网 发布:德国布线火遍网络 编辑:程序博客网 时间:2024/05/17 02:01
webpack配置
前言
我以前使用的自动化构建工具是gulp
,感觉还是挺好用的,然后在学习js开发模块化时,先是入了seajs
这个坑,seajs
在早些年就已经没有再维护了,而且使用起来很不友好,所以就找到了2016的新贵webpack
,囊括了前端自动化和模块化打包的功能,不过学习webpack
也是有不少坑的,在网上学习了挺多所谓的快速入门后,发现缺点是都很零散,没有一个很好的webpack
配置例子,然后机缘巧合下再yeoman
下发现了react-webpack
一个自动生成的项目,这是针对reactjs
使用的webpack
配置,但也可以作为简单的前端自动化配置参考。
我的demo在文末,谢谢
原react-webpack
github地址:react-webpack
下图是react-webpack
的官方目录结构
而下图是我参考后简化的目录结构 简化的react-webpack目录结构
webpack配置
step1:配置webpack.config.js
我们先创建webpack.config.js
文件,即我们的基本配置文件,通常的情况下我们会把所有的配置项都写在这里面,但这里我们会把配置项拆分,把详细的配置项都放到了cfg
文件夹中,并且分开开发环境和生产环境使用。
首先我们需要读取开发环境或者生产环境的参数,我这里使用了minimist
模块来读取命令行的参数
//此处会把命令行的的参数都出来 const args = require("minimist")(process.argv.slice(2));
如我们最终运行时输入命令行webpack-dev-server --env=dev --progress --colors --hot --inline
args会读取到的内容如下,那我们就可以根据env的不同值进行不同的操作。
{ _: [], env: 'dev', progress: true, colors: true, hot: true, inline: true }
最终基本的webpack.config.js的配置如下:
"use strict"; const path = require("path"); const args = require("minimist")(process.argv.slice(2)); let config = require(path.join(__dirname, 'cfg/' + args.env)); module.exports = config;
Step2配置cfg文件中的配置文件
- 先配置
defaults.js
文件,这里很简单,就直接给出,又需要的可以增加loader
"use strict";const path = require('path');const srcPath = path.join(__dirname, '/../src');const port = 8000;//浏览器打开端口function getDefaultModules() { return { loaders: [{ test: /\.js/, loader: "babel-loader", include: srcPath, }, { test: /\.css/, loader: "style-loader!css-loader", include: srcPath }] }}module.exports = { srcPath: srcPath, publicPath: "/assets/", port: port, getDefaultModules: getDefaultModules};
- 配置
base.js
文件,需要引进defaults.js,这里主要是配置webpack-dev-server的参数和出口文件
'use strict';let path = require("path");let defaultSettings = require("./defaults");module.exports = { port: defaultSettings.port, output: { path: path.join(__dirname, '../dist/assets'), filename: 'app.js', publicPath: defaultSettings.publicPath }, devServer: { contentBase: './src/', hot: true, port: defaultSettings.port, inline: true, process: true, colors: true }, resolve: { extensions: ['', '.js', '.jsx'], }, module: {}};
- 接着是主要引入的
dev.js
文件,需要引入base.js
和defaults.js
,这里主要配置入口文件,把原来再webpack.config.js
中应该配置的信息在这里进行整合,添加webpack
处理插件等
"use strict";let webpack = require("webpack");let baseConfig = require('./base');let defaultSettings = require('./defaults');let config = Object.assign({}, baseConfig, { entry: [ //注释部分是使用配置文件配置webpack-dev-server参数,我这里使用的是命令行传参数 // 'webpack-hot-middleware/client?http://127.0.0.1:' + defaultSettings.port, // 'webpack/hot/only-dev-server', './src/index' ], cache: false, devtool: 'eval-source-map', plugins: [ new webpack.HotModuleReplacementPlugin(), new webpack.NoErrorsPlugin(), ], module: defaultSettings.getDefaultModules()});module.exports = config;
- 而
src
里的文件很简单
<!--/src/index.html--><p id="page">123456</p><script type="text/javascript" src="./assets/app.js"></script>
/*/src/style.css*/body{ background: gainsboro; font-size: 50px;}
// /src/index.jsrequire("./style.css");document.getElementById('page').innerHTML = "Hello world!";
Step3 运行文件
运行命令行webpack-dev-server --env=dev --progress --colors --hot --inline
浏览器打开localhost:8000
即可查看,并且更改style.css
和index.js
文件可以看到浏览器即时刷新,至此我们的配置就基本完成了
Step4 打包
打包的话我们需要在cfg
文件中新建dist.js
文件,而运行时我们的命令行变为webpack --env=dist
,然后我们就会根据env
参数加载dist.js
而不是上面的dev.js
主要配置其实和dev.js
是大同小异的,只是使用的命令不同,所以一个会在服务端打开,一个会把文件打包,代码如下:
"use strict";let path = require("path");let webpack = require("webpack");let baseConfig = require('./base');let defaultSettings = require('./defaults');let config = Object.assign({}, baseConfig, { entry: path.join(__dirname, '../src/index'), plugins: [ new webpack.DefinePlugin({ 'process.env.NODE_ENV': '"production"' }), new webpack.HotModuleReplacementPlugin(), new webpack.NoErrorsPlugin(), new webpack.optimize.UglifyJsPlugin(), //压缩 new webpack.optimize.OccurenceOrderPlugin(), //根据模块引用频率,来调整模块顺序,定义模块id,引用频率越高,id越短,增加加载速度 new webpack.optimize.AggressiveMergingPlugin(), //优化代码,合并相似部分,提取公共部分 new webpack.optimize.DedupePlugin(), //检测相似文件,合并时去除冗余 ], module: defaultSettings.getDefaultModules()});module.exports = config;
这是运行命令行webpack --env=dist
将会在根目录下得到/dist/assets/app.js/
文件,这是打包好的文件,要运行的话需要手动拷贝index.html
到/dist/
文件中
Step5 使自动化流程更简洁
现在的问题是:
* 使用服务端时,需要手动打开浏览器,输入地址
* 打包时需要复制index.html
文件
* 命令行太长,不好记
解决问题1:
安装open
模块,在webpack.config.js
中加入下列代码:
//...const open = require("open"); //打开浏览器open('http://localhost:' + config.port + '/webpack-dev-server/');
这里url路径加上/webpack-dev-server/
会在顶部看到应用状态
解决问题2和3:
安装copy
和copyfiles
模块,在package.json
中加入以下代码:
"scripts": { "start": "webpack-dev-server --env=dev --progress --colors --hot --inline", "dist": "webpack --env=dist & npm run copy", "copy": "copyfiles -f ./src/index.html ./dist" },
之后就可以使用npm start
实时开发
npm run dist
进行打包
最后demo放在webpack-simple-config demo
- webpack配置
- webpack配置
- webpack 配置
- webpack配置
- webpack配置
- webpack 配置
- webpack配置
- webpack配置
- Webpack配置
- webpack配置
- webpack echarts配置实例
- webpack安装和配置
- webpack 发布配置
- webpack配置浅析
- webpack(二)配置
- django-webpack配置
- gulp+webpack配置
- React+Webpack打包配置
- 南阳791 Color the fence
- WordPress 查询调用文章所属的分类id,根据文章id查cat分类栏目id方法
- P2P协议学习
- 有一牧场,已知养牛27头,6天把草吃尽;养牛23头,9天把草吃尽。如果养牛21头,那么几天能把牧场上的草吃尽呢?并且牧场上的草是不断生长的。
- Android 拍照适配方案
- webpack配置
- android遮罩Xfermode的学习
- Java并发编程之二十:并发新特性—Lock锁和条件变量(含代码)
- unity 关节
- Android Fragment 真正的完全解析(上)
- 输入框中基于javascript的数据格式的验证
- 并发逻辑备份工具mydumper实践
- java学习日记_50:匿名内部类
- 拓扑排序 详解 + 并查集 详解 + 最小生成树(MST)详解 【普利姆算法 + 优先队列优化 & 克鲁斯卡尔算法】