热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

webpack的发布配置及优化详解

一、webpack的发布策略1、在实际开发中,一般会有两套项目方案:一套是开发期间的项目,包含了测试文件、测试数据、开发工具、测试工具

一、webpack的发布策略

1、 在实际开发中,一般会有两套项目方案:


  • 一套是开发期间的项目,包含了测试文件、测试数据、开发工具、测试工具等相关配置,有利于项目的开发和测试,但是这些文件仅用于开发,发布项目时候需要剔除;
  • 另一套是部署期间的项目,剔除了那些客户用不到的测试数据测试工具和文件,比较纯净,减少了项目发布后的体积,有利于安装和部署!

2、为了满足我们的发布策略,需要新建一个配置文件,命名为webpack.publ.config.js,将webpack.config.js的配置拷贝过去,剔除一些开发配置项即可:


  • devServer节点删掉:

devServer: {hot: true,open: true,port: 4321}

  • plugins节点下的热更新插件删掉:

new webpack.HotModuleReplacementPlugin()

3、修改url-loader,将图片放入统一的images文件夹之下:

{ test: /\.(png|jpg|gif)$/, use: 'url-loader?limit=43959&name=images/[name].[ext]' }

或者使用img-前缀加上7位的hash名称:

{ test: /\.(png|jpg|gif)$/, use: 'url-loader?limit=43959&name=images/img-[hash:7].[ext]' }

4、 在package.json中的script节点下新增dev命令,通过--config指定webpack启动时要读取的配置文件:

"pub": "webpack --config webpack.publish.config.js"

二、 每次重新构建时候删除dist目录

1、 运行npm i clean-webpack-plugin --save-dev
2.、在头部引入这个插件:

var cleanWebpackPlugin = require('clean-webpack-plugin');

3、在plugins节点下使用这个插件:

new cleanWebpackPlugin(['dist'])

三、 分离第三方包改造webpack.pub.config.js

1、改造entry节点如下:

entry: {app: path.resolve(__dirname, 'src/js/main.js'), // 自己代码的入口vendors: ['jquery'] // 要分离的第三方包的入口}

/2、 在plugins节点下新增插件:

new webpack.optimize.CommonsChunkPlugin({ // 抽离第三方包的插件name:'vendors', // 指定抽离第三方包的入口名称filename:'vendors.js' // 抽离出的公共模块的名称
})

3、html-webpack-plugin在生成index.html文件的时候,会自动将抽离的第三方包引入进去!


四、 优化压缩JS

在plugins数组中添加:

new webpack.optimize.UglifyJsPlugin({ // 优化压缩JScompress:{warnings:false // 移除警告}
}),
new webpack.DefinePlugin({ // 设置为产品上线环境,进一步压缩JS代码'process.env.NODE_ENV': '"production"'
})

五、 优化压缩HTML文件

plugins节点下的htmlWebpackPlugin插件中,添加minify子节点:

minify:{// 压缩HTML代码collapseWhitespace:true, // 合并空白字符removeComments:true, // 移除注释removeAttributeQuotes:true // 移除属性上的引号
}

其他优化项请参考:html-minifier - github


六、 抽取CSS文件


  1. 运行npm install --save-dev extract-text-webpack-plugin安装抽取CSS文件的插件。
  2. 在配置文件中导入插件:

const ExtractTextPlugin = require("extract-text-webpack-plugin");

  1. 修改CSS和Sass的loader如下:

{test: /\.css$/, use: ExtractTextPlugin.extract({fallback: "style-loader",use: ["css-loader"],publicPath: '../' // 设置图片路径})
},
{test: /\.scss$/, use: ExtractTextPlugin.extract({fallback: "style-loader",use: ['css-loader', 'sass-loader'],publicPath: '../' // 设置图片路径})
}

  1. 在plugins节点下新增插件:

new ExtractTextPlugin("css/styles.css"), // 抽取CSS文件的插件

七、压缩抽取出来的CSS文件


  1. 运行npm i optimize-css-assets-webpack-plugin --save-dev安装插件到开发依赖。
  2. 在配置文件头部导入插件:

var OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin');

  1. 在plugins节点下新增插件:

new OptimizeCssAssetsPlugin() // 压缩CSS文件的插件

八、配置参考:

.babelrc文件

{"presets": ["env", "stage-0"],"plugins": ["transform-runtime"]
}

package.json文件

{"name": "demo","version": "1.0.0","description": "","main": "webpack.config.js","scripts": {"test": "echo \"Error: no test specified\" && exit 1","dev": "webpack-dev-server --open --port 3000 --hot", //开发运行配置端口及热部署"pub": "webpack --config webpack.pub.config.js" // 发布阶段,指定开发配置},"keywords": [],"author": "","license": "ISC","dependencies": {"jquery": "^3.2.1" //生产依赖插件},"devDependencies": { // 开发依赖"babel-core": "^6.26.0","babel-loader": "^7.1.2","babel-plugin-transform-runtime": "^6.23.0","babel-preset-env": "^1.6.1","babel-preset-stage-0": "^6.24.1","clean-webpack-plugin": "^0.1.17","css-loader": "^0.28.7","extract-text-webpack-plugin": "^3.0.2","file-loader": "^1.1.5","html-webpack-plugin": "^2.30.1","node-sass": "^4.6.0","optimize-css-assets-webpack-plugin": "^3.2.0","sass-loader": "^6.0.6","style-loader": "^0.19.0","url-loader": "^0.6.2","webpack": "^3.8.1","webpack-dev-server": "^2.9.4"}
}

webpack.config.js配置(作为开发阶段的配置)

const path = require('path')
const htmlWebpackPlugin = require('html-webpack-plugin')module.exports = {entry: path.join(__dirname, './src/main.js'),output: {path: path.join(__dirname, './dist'),filename: 'bundle.js'},plugins: [ // 插件new htmlWebpackPlugin({template: path.join(__dirname, './src/index.html'),filename: 'index.html'})],module: {rules: [{ test: /\.css$/, use: ['style-loader', 'css-loader'] }, // css{ test: /\.scss$/, use: ['style-loader', 'css-loader', 'sass-loader'] },{ test: /\.(png|gif|bmp|jpg)$/, use: 'url-loader?limit=5000' },{ test: /\.js$/, use: 'babel-loader', exclude: /node_modules/ }]}
}

webpack.pub.config.js 上线打包配置文件

const path = require('path')
const htmlWebpackPlugin = require('html-webpack-plugin')
// 导入每次删除文件夹的插件
const cleanWebpackPlugin = require('clean-webpack-plugin')
const webpack = require('webpack')
// 导入抽取CSS的插件
const ExtractTextPlugin = require("extract-text-webpack-plugin")
// 导入压缩CSS的插件
const OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin')module.exports = {entry: { // 配置入口节点app: path.join(__dirname, './src/main.js'),vendors1: ['jquery'] // 把要抽离的第三方包的名称,放到这个数组中},output: {path: path.join(__dirname, './dist'),filename: 'js/bundle.js'},plugins: [ // 插件new htmlWebpackPlugin({template: path.join(__dirname, './src/index.html'),filename: 'index.html',minify: {collapseWhitespace: true, // 合并多余的空格removeComments: true, // 移除注释removeAttributeQuotes: true // 移除 属性上的双引号}}),new cleanWebpackPlugin(['dist']),new webpack.optimize.CommonsChunkPlugin({name: 'vendors1', // 指定要抽离的入口名称filename: 'js/vendors.js' // 将来再发布的时候,除了会有一个 bundle.js ,还会多一个 vendors.js 的文件,里面存放了所有的第三方包}),new webpack.optimize.UglifyJsPlugin({compress: { // 配置压缩选项warnings: false // 移除警告}}),new webpack.optimize.DedupePlugin({ // 设置为产品上线环境,进一步压缩JS代码'process.env.NODE_ENV': '"production"'}),new ExtractTextPlugin("css/styles.css"), // 抽取CSS文件new OptimizeCssAssetsPlugin()// 压缩CSS的插件],module: {rules: [{test: /\.css$/, use: ExtractTextPlugin.extract({fallback: "style-loader",use: "css-loader",publicPath: '../' // 指定抽取的时候,自动为我们的路径加上 ../ 前缀})},{test: /\.scss$/, use: ExtractTextPlugin.extract({fallback: 'style-loader',use: ['css-loader', 'sass-loader'],publicPath: '../' // 指定抽取的时候,自动为我们的路径加上 ../ 前缀})},{ test: /\.(png|gif|bmp|jpg)$/, use: 'url-loader?limit=5000&name=images/[hash:8]-[name].[ext]' },{ test: /\.js$/, use: 'babel-loader', exclude: /node_modules/ }]}
}

推荐阅读
  • 微信民众号商城/小顺序商城开源项目介绍及使用教程
    本文介绍了一个基于WeiPHP5.0开发的微信民众号商城/小顺序商城的开源项目,包括前端和后端的目录结构,以及所使用的技术栈。同时提供了项目的运行和打包方法,并分享了一些调试和开发经验。最后还附上了在线预览和GitHub商城源码的链接,以及加入前端交流QQ群的方式。 ... [详细]
  • 本文介绍了JavaScript进化到TypeScript的历史和背景,解释了TypeScript相对于JavaScript的优势和特点。作者分享了自己对TypeScript的观察和认识,并提到了在项目开发中使用TypeScript的好处。最后,作者表示对TypeScript进行尝试和探索的态度。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • loader资源模块加载器webpack资源模块加载webpack内部(内部loader)默认只会处理javascript文件,也就是说它会把打包过程中所有遇到的 ... [详细]
  • React 小白初入门
    推荐学习:React官方文档:https:react.docschina.orgReact菜鸟教程:https:www.runoob.c ... [详细]
  • Firefox火狐浏览器关闭到http://detectportal.firefox.com的流量问题解决办法
    本文介绍了使用Firefox火狐浏览器时出现关闭到http://detectportal.firefox.com的流量问题,并提供了解决办法。问题的本质是因为火狐默认开启了Captive portal技术,当连接需要认证的WiFi时,火狐会跳出认证界面。通过修改about:config中的network.captive-portal-service.en的值为false,可以解决该问题。 ... [详细]
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • (三)多表代码生成的实现方法
    本文介绍了一种实现多表代码生成的方法,使用了java代码和org.jeecg框架中的相关类和接口。通过设置主表配置,可以生成父子表的数据模型。 ... [详细]
  • Node.js学习笔记(一)package.json及cnpm
    本文介绍了Node.js中包的概念,以及如何使用包来统一管理具有相互依赖关系的模块。同时还介绍了NPM(Node Package Manager)的基本介绍和使用方法,以及如何通过NPM下载第三方模块。 ... [详细]
  • Vue基础一、什么是Vue1.1概念Vue(读音vjuː,类似于view)是一套用于构建用户界面的渐进式JavaScript框架,与其它大型框架不 ... [详细]
  • 必须先赞下国人npm库作品:node-images(https:github.comzhangyuanweinode-images),封装了跨平台的C++逻辑,形成nodejsAP ... [详细]
  • RN即ReactNative基于React框架针对移动端的跨平台框架,在学习RN前建议最好熟悉下html,css,js,当然如果比较急,那就直接上手吧,毕竟用学习前面基础的时间,R ... [详细]
  • 生成对抗式网络GAN及其衍生CGAN、DCGAN、WGAN、LSGAN、BEGAN介绍
    一、GAN原理介绍学习GAN的第一篇论文当然由是IanGoodfellow于2014年发表的GenerativeAdversarialNetworks(论文下载链接arxiv:[h ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
author-avatar
莫怀嘉805
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有