WEBPACK开发|生产环境配置(抽离公共部分)

这是webpack4演示,webpack5有些插件不在推荐,

1. webpack.base.config.js文件的配置说明

const path = require('path');
const webpack = require('webpack');
const ExtractTextPlugin = require('extract-text-webpack-plugin'); // 该插件的主要是为了抽离css样式,防止将样式打包在js中引起页面样式加载错乱的现象
// const CleanWebpackPlugin = require('clean-webpack-plugin');function resolve (dir) {return path.join(__dirname, dir);
}module.exports = {// webpack打包入口entry: {main: './src/main',vendors: './src/vendors' // 去除不必要的插件,在index.html中需要引入这个文件// 也就是在index.html中加入  <script src="/build/vendor.js"></script>},// webpack打包转换后的文件输出到磁盘位置output: {// __dirname始终指向被执行js文件的绝对路径,这里的path就是指向dist文件夹(也就是输出的位置)path: path.join(__dirname, '../dist/')},// externals: {//     'vue': 'Vue',//     'iview': 'iview',//     'vue-router': 'VueRouter',//     'vuex': 'Vuex',//     'js-cookie': 'Cookies',//     // 'tinymce': 'tinymce',//     'axios': 'axios',//     // 'echarts': 'echarts',//     // 'html2canvas': 'html2canvas',//     // 'sortablejs': 'Sortable'// },/*** loader是模块解析,模块转换器* webpack是模块打包工具,而模块不仅仅是js,还可以是css,图片或者其他格式* 但是webpack默认只处理js和json,其他模块就需要用loader了*/ // 模块配置,在webpack里一切皆模块,用来配置需要的匹配规则及使用哪种loader转换器module: {rules: [{test: /\.vue$/, // 正则表达式匹配规则,适配vueloader: 'vue-loader', // 使用vue-loader,加载和转义vue组件options: {loaders: {less: ExtractTextPlugin.extract({use: ['css-loader?minimize', 'autoprefixer-loader', 'less-loader'],fallback: 'vue-style-loader'}),css: ExtractTextPlugin.extract({use: ['css-loader', 'autoprefixer-loader'],fallback: 'vue-style-loader'})}}},{test: /iview\/.*?js$/,loader: 'babel-loader'},{test: /\.js$/,loader: 'babel-loader',exclude: /node_modules/},{test: /\.css$/,use: ExtractTextPlugin.extract({use: ['css-loader?minimize', 'autoprefixer-loader'], // 指定需要什么样的loader去编译文件,这里由于源文件是.css所以选择css-loaderfallback: 'style-loader' // 编译后用什么loader来提取css文件})},{test: /\.less/,use: ExtractTextPlugin.extract({use: ['autoprefixer-loader', 'less-loader'], // autoprefixer-loader具有自动添加css前缀的功能fallback: 'style-loader'})},{test: /\.(gif|jpg|png|woff|svg|eot|ttf)\??.*$/,loader: 'url-loader'},{test: /\.(html|tpl)$/,loader: 'html-loader'}]},resolve: {// resolve.extensions在导入语句没带文件后缀时,webpack会自动带上后缀,去尝试查找文件是否存在,但是在查找的时候,会耗费一定的打包时间extensions: ['.js', '.vue'],alias: { // resolve.alias配置通过别名来将原导入路径映射成一个新的导入路径(优化开发体验)'vue': 'vue/dist/vue.esm.js','@': resolve('../src'),'@views': resolve('../src/views'),'assets': resolve('../src/assets/'),'store': resolve('../src/store/'),'jquery': resolve('../src/common/js/jquery.js')}},// 增加一个pluginsplugins: [new webpack.ProvidePlugin({$: "jquery",jQuery: "jquery"}),// new CleanWebpackPlugin('dist/*.*', {//     root: __dirname,//     verbose: true,//     dry: false// })],
};

2. webpack.dev.config.js文件的配置说明(开发环境)

const webpack = require('webpack');
// HtmlWebpackPlugin作用:
// 1、为html文件中引入的外部资源如script、link动态添加每次compile后的hash,防止引用缓存的外部文件问题
// 2、可以生成创建html入口文件,比如单页面可以生成一个html文件入口,配置N个html-webpack-plugin可以生成N个页面入口
const HtmlWebpackPlugin = require('html-webpack-plugin');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const merge = require('webpack-merge');
const webpackBaseConfig = require('./webpack.base.config.js');
const fs = require('fs'); //fs 是 file-system 的简写,就是文件系统的意思;在 Node 中如果想要进行文件操作,就必须引入 fs 这个核心模块fs.open('./src/config/env.js', 'w', function (err, fd) {const buf = 'export default "development";';// node --version < v10.1.0// fs.write(fd, buf, 0, buf.length, 0, function (err, written, buffer) {});// node --version > v10.1.0fs.write(fd, buf, 0, 'utf-8', function (err, written, buffer) {if (err) {throw new Error(err);}});
});module.exports = merge(webpackBaseConfig, {// devtool: '#source-map',devtool: '#cheap-module-eval-source-map',output: {publicPath: '/dist/',filename: '[name].js',chunkFilename: '[name].chunk.js'},plugins: [ // 每个插件的具体API配置new ExtractTextPlugin({filename: '[name].css',allChunks: true}),new webpack.optimize.CommonsChunkPlugin({name: 'vendors',filename: 'vendors.js'}),new HtmlWebpackPlugin({ // 打包输出HTMLfilename: '../index.html',template: './src/template/index.ejs',title: '同花顺管理平台',inject: false})],devServer: {port: 8082,host: '0.0.0.0',watchOptions: { // 配置webpack服务ignored: '/node_modules/', // 不监测poll: 1200 // 监测修改的时间(ms)},// lazy: true,//只有在请求时才编译包(bundle)。这意味着 webpack 不会监视任何文件改动。我们称之为“惰性模式”。proxy: { // 设置代理'/yyzt-web': {// target: 'http://121.33.247.51:8602''http://cbas.ths8.com',// target: 'http://127.0.0.1:9080',// target: 'http://cbas.ths8.com',changeOrigin: true,target: 'http://cbas.ths8.com:81',pathRewrite: {'^/yyzt-web': '/yyzt3-web'}},'/yyzt3-web': {// target: 'http://121.33.247.51:8602''http://cbas.ths8.com',// target: 'http://127.0.0.1:9080',target: 'http://cbas.ths8.com:81',// target: 'http://113.9.77.117:9711',// target: 'http://172.20.51.196:8080',changeOrigin: true,pathRewrite: {'^/yyzt3-web': '/yyzt3-web'}},// 自己添加的图片代理'/group1': { // 需要请求的资源target: "http://cbas.ths8.com:81", // 目标域名及地址changeOrigin: true, // 是否跨域pathRewrite: { // 地址重定向'^/group1': '/group1' // 也就是将前面的group1替换成后面的(这里是一样的,所以可以不写)}},'/cbas': {// target: 'http://121.33.247.51:8602''http://cbas.ths8.com',// target: 'http://127.0.0.1:9080',target: 'http://106.37.195.27:8083',changeOrigin: true,pathRewrite: {'^/cbas': '/cbas'}},'/yyzt-html': {// target: 'http://192.168.51.234:8080',target: 'http://point.stocke.com.cn',changeOrigin: true,pathRewrite: {'^/yyzt-html': '/yyzt-html'}},'/point': {// target: 'http://121.33.247.51:8602''http://cbas.ths8.com' 'http://127.0.0.1:9102',target: 'http://127.0.0.1:9102',changeOrigin: true,pathRewrite: {'^/point': '/point'}},'/hexinifs': {// target: 'http://192.168.51.234:8080',target: 'http://point.stocke.com.cn',changeOrigin: true,pathRewrite: {'^/hexinifs': '/hexinifs'}},'/yyzt-uamp-web': {target: 'http://point.stocke.com.cn',// target: 'http://cbas.ths8.com',changeOrigin: true,pathRewrite: {'^/yyzt-uamp-web': '/yyzt-uamp-web'}}}}
});

3. webpack.prod.config.js文件的配置说明(生产环境)

const webpack = require('webpack');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const merge = require('webpack-merge');
const webpackBaseConfig = require('./webpack.base.config.js');
const CleanWebpackPlugin = require('clean-webpack-plugin');
const fs = require('fs');
var path = require('path')
const FastUglifyJsPlugin = require('fast-uglifyjs-plugin');fs.open('./src/config/env.js', 'w', function (err, fd) {const buf = 'export default "production";';// fs.write(fd, buf, 0, buf.length, 0, function(err, written, buffer) {});fs.write(fd, buf, 0, 'utf-8', function (err, written, buffer) { });
});module.exports = merge(webpackBaseConfig, {output: {publicPath: './dist/',filename: '[name].[hash].js',chunkFilename: '[name].[hash].chunk.js'},plugins: [new ExtractTextPlugin({filename: '[name].[hash].css',allChunks: true}),new webpack.optimize.CommonsChunkPlugin({name: 'vendors',filename: 'vendors.[hash].js'}),new webpack.DefinePlugin({'process.env': {NODE_ENV: '"production"'}}),// new webpack.optimize.UglifyJsPlugin({//     compress: {//         warnings: false//     }// }),new FastUglifyJsPlugin({sourceMap: true,compress: {warnings: false,drop_console: true,},// debug设为true可输出详细缓存使用信息:debug: true,// 默认开启缓存,提高uglify效率,关闭请使用 false:cache: true,// 默认缓存路径为项目根目录,手动配置请使用:cacheFolder: path.resolve(__dirname, '../.build_cache'),// 工作进程数,默认os.cpus().lengthworkerNum: 2}),new HtmlWebpackPlugin({filename: '../index_prod.html',template: './src/template/index.ejs',title: '同花顺管理平台',inject: false}),new CleanWebpackPlugin(['./dist/main.*.css', './dist/*.js'],  //匹配删除的文件{root: __dirname,                 //根目录verbose: true,                  //开启在控制台输出信息dry: true                  //启用删除文件})]
});

4.webpack-merge 合并配置文件

webpack-merge 是一个工具,它允许你将多个 webpack 配置文件合并成一个,这对于维护不同环境(如开发环境、生产环境)的配置特别有用。通过使用 webpack-merge,你可以保持基础配置不变,同时为不同环境添加或覆盖特定的配置选项。

以下是如何使用 webpack-merge 来合并 webpack 配置文件的示例:

首先,你需要安装 webpack-merge:

bash复制代码
npm install --save-dev webpack-merge
yarn add webpack-merge --dev

安装完成后,webpack-merge 将被添加到你的 node_modules 目录中,并且其版本信息将被添加到你的 package.json 文件的 devDependencies 部分。

然后,你可以创建多个配置文件,例如一个基础配置文件 webpack.base.config.js,一个用于开发环境的配置文件 webpack.dev.config.js,以及一个用于生产环境的配置文件 webpack.prod.config.js。

webpack.base.config.js

javascript复制代码const path = require('path');  module.exports = {  entry: {  app: './src/index.js'  },  output: {  filename: '[name].bundle.js',  path: path.resolve(__dirname, 'dist')  },  module: {  rules: [  // 通用加载器配置  ]  },  // 其他通用配置...  
};

webpack.dev.config.js

javascript复制代码const merge = require('webpack-merge');  
const baseConfig = require('./webpack.base.config.js');  module.exports = merge(baseConfig, {  mode: 'development',  devtool: 'inline-source-map',  devServer: {  contentBase: './dist',  hot: true  },  // 开发环境特有的配置...  
});

webpack.prod.config.js

javascript复制代码const merge = require('webpack-merge');  
const baseConfig = require('./webpack.base.config.js');  module.exports = merge(baseConfig, {  mode: 'production',  optimization: {  minimize: true  },  plugins: [  // 生产环境特有的插件...  ],  // 生产环境特有的配置...  
});

在上面的示例中,webpack.dev.config.js 和 webpack.prod.config.js 都使用了 webpack-merge 来合并 webpack.base.config.js 中的基础配置。然后,它们各自添加了针对开发环境和生产环境的特定配置。

通过这种方式,你可以确保基础配置的一致性,并只关注不同环境之间的差异。当你运行 webpack 时,只需要根据当前环境选择正确的配置文件即可。

例如,在开发环境中,你可以这样运行 webpack:

bash复制代码
npx webpack --config webpack.dev.config.js

在生产环境中,你可以这样运行:

bash复制代码
npx webpack --config webpack.prod.config.js

或者,你可以在 package.json 的 scripts 部分设置相应的命令,以便更方便地运行 webpack。

常用的loader和插件种类繁多,以下是一些常见的示例:

Loader示例:

  1. babel-loader:用于将ES6+的语法转化为向后兼容的JavaScript版本,使得新特性能够在旧版浏览器中使用。
  2. style-loadercss-loader:用于处理CSS文件。style-loader将CSS添加到DOM中,而css-loader解析CSS文件中的import和url()。
  3. file-loaderurl-loader:用于处理在JavaScript中引入的文件,例如图片或字体文件。它们能够将文件移动到输出目录,并在代码中引用它们。
  4. vue-loader:专门用于加载Vue.js组件,处理单文件组件的.vue文件。
  5. ts-loader:用于加载TypeScript文件,并将其转换为JavaScript。

插件示例:

  1. HtmlWebpackPlugin:简化HTML文件的创建,自动引入打包后的JS文件。
  2. MiniCssExtractPlugin:将CSS提取到单独的文件中,而不是嵌入到JS中。
  3. CleanWebpackPlugin:在每次构建之前清理输出目录,确保没有旧的构建文件。
  4. DefinePlugin:允许在编译时创建配置的全局常量,这对于配置模式或环境变量非常有用。
  5. CopyWebpackPlugin:将单个文件或整个目录复制到构建目录中。
  6. WebpackBar:在构建过程中显示进度条和相关信息,提供视觉反馈。

这些只是众多可用loader和插件中的一部分。实际上,webpack的生态系统非常庞大,你可以根据项目需求选择适合的loader和插件。同时,随着技术的不断发展,新的loader和插件也不断涌现,建议经常查看webpack的官方文档和社区资源,以获取最新的信息和最佳实践。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/15672.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode面试经典150题】100. 相同的树

一、题目 100. 相同的树 - 力扣&#xff08;LeetCode&#xff09; 给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 二、思路 二叉树的题&#…

C++的lambda函数、bind函数、类函数绑定参数,学习测试用例

在C中&#xff0c;Lambda函数、std::bind 和类函数绑定参数提供了灵活的方式来处理函数调用。 Lambda函数是一种匿名函数&#xff0c;可以捕获外部变量并在函数体内使用。它们提供了简洁而强大的方式来定义内联函数。std::bind 用于创建一个新的函数对象&#xff0c;其中部分参…

2024电工杯数学建模B题高质量成品论文,包括代码数据

2024电工杯数学建模B题高质量成品论文&#xff0c;包括代码数据 完整内容见文末名片 摘要 大学时期是学生们知识学习和身体成长的重要阶段&#xff0c;良好的饮食习惯对于促进生长发育和保证身体健康具有重要意义。针对当前大学生中存在的饮食结构不合理及不良饮食习惯的问题…

为了性能,放弃tft_eSPI,选择arduino_gfx吧

本来对于tft_espi和arduino_gfx没啥特别的感觉&#xff0c;都是tft屏幕驱动,arduino_gfx的好处就是除了支持tft外还支持一些oled屏幕。 谁知道在探寻我那个在单片机项目上显示中文方案 https://github.com/StarCompute/tftziku 时候&#xff0c;寻求极致性能测了一些东西。 t…

23种设计模式之一————工厂模式详细讲解

工厂模式介绍 定义分类工厂模式核心角色&#xff1a;简单工厂模式定义特点优点缺点应用场景代码实现 工厂方法模式&#xff08;别名&#xff1a;虚拟构造&#xff09;定义特点优点缺点应用场景代码实现 抽象工厂模式定义特点优点缺点应用场景代码实现工厂模式小结 定义 工厂模…

算法之背包问题

可分的背包问题是可以用贪心法来解决&#xff0c;而0-1背包问题通常使用动态规划方法来解决。 可分背包问题&#xff1a; 在可分背包问题中&#xff0c;物品可以被分割&#xff0c;您可以取走物品的一部分以适应背包的容量。这里的关键是物品的价值密度&#xff0c;即单…

最小产品价格差值

题目描述 给定某产品多少天的价格&#xff0c;记录于prices中&#xff0c;请找出任意两天之间的最小价格差&#xff08;即abs(prices[i] - prices[j])&#xff09;的最小值&#xff0c;i!j&#xff09;并计算最小介个差组合的个数 样例1 输入 [1,3,7,5,12] 输出 3 样例2…

VTK9.2.0+QT5.14.0绘制三维显示背景

背景 上一篇绘制点云的博文中&#xff0c;使用的vtkCameraOrientationWidget来绘制的坐标轴&#xff0c;最近又学习到两种新的坐标轴绘制形式。 vtkOrientationMarkerWidget vtkAxesActor 单独使用vtkAxesActor能够绘制出坐标轴&#xff0c;但是会随着鼠标操作旋转和平移时…

微服务中使用Maven BOM来管理你的版本依赖

摘要: 原创出处 sf.gg/a/1190000021198564 「飘渺Jam」欢迎转载&#xff0c;保留摘要&#xff0c;谢谢&#xff01; 为什么要使用BOM? 如何定义BOM? 项目使用方法? BOM&#xff08;Bill of Materials&#xff09;是由Maven提供的功能,它通过定义一整套相互兼容的jar包版…

通过 NIO + 多线程 提升硬件设备与系统的数据传输性能

一、项目展示 下图&#xff08;模拟的数据可视化大屏&#xff09;中数据是动态显示的 二、项目简介 描述&#xff1a;使用Client模拟了硬件设备&#xff0c;比如可燃气体浓度检测器。Client通过Socket与Server建立连接&#xff0c;Server保存数据到txt文件&#xff0c;并使用W…

结构体(位段)内存分配

结构体由多个数据类型的成员组成。那编译器分配的内存是不是所有成员的字节数总和呢&#xff1f; 首先&#xff0c;stu的内存大小并不为29个字节&#xff0c;即证明结构体内存不是所有成员的字节数和。   其次&#xff0c;stu成员中sex的内存位置不在21&#xff0c;即可推测…

Swift 请求用户授权以跟踪其跨应用或网站的活动

步骤1:导入框架 首先,需要在Swift文件中导入AppTrackingTransparency框架。 import AppTrackingTransparency import AdSupport步骤2:请求跟踪许可 在适当的地方请求用户的跟踪许可。通常,这个请求会在应用启动时或者在用户执行某些操作(例如,访问应用中的广告相关功能…

Linux服务器安装docker,基于Linux(openEuler、CentOS8)

本实验环境为openEuler系统(以server方式安装)&#xff08;CentOS8基本一致&#xff0c;可参考本文) 目录 知识点实验 知识点 Docker 是一个开源的应用容器引擎。它允许开发者将应用及其所有依赖项打包到一个可移植的容器中&#xff0c;并发布到任何支持Docker的流行Linux或Wi…

基于python flask的web服务

基本例子 from flask import Flask app Flask(__name__) app.route(/)#检查访问的网址&#xff0c;根路径走这里 def hello_world():return hello world#返回hello worldif __name__ __main__:# 绑定到指定的IP地址和端口app.run(host0.0.0.0, port1000, debugTrue)##绑定端…

设计一个完美的用户角色权限表

设计一个完美的用户角色权限表需要考虑系统的安全性、灵活性和可扩展性。以下是一个详细的用户角色权限管理表设计方案&#xff0c;包含多个表结构和字段描述。 目录 1. 用户表&#xff08;Users Table&#xff09;2. 角色表&#xff08;Roles Table&#xff09;3. 权限表&…

【数据结构与算法 | 基础篇】环形数组模拟队列

1. 前言 上文我们用环形单向链表实现了队列.接下来我们用环形数组来模拟队列.并实现了isFull()&#xff0c;isEmpty()等方法. 2. 环形数组模拟队列 (1). Queue接口 : public interface Queue<E> {//向队伍插入值, 插入成功返回true, 否则返回falseboolean offer(E v…

【Linux】TCP协议【上】{协议段属性:源端口号/目的端口号/序号/确认序号/窗口大小/紧急指针/标记位}

文章目录 1.引入2.协议段格式4位首部长度16位窗口大小32位序号思考三个问题【demo】标记位URG: 紧急指针是否有效提升某报文被处理优先级【0表示不设置1表示设置】ACK: 确认号是否有效PSH: 提示接收端应用程序立刻从TCP缓冲区把数据读走RST: 对方要求重新建立连接; 我们把携带R…

windows 设置系统字体 (win11 win10)

由于微软的字体是有版权的&#xff0c;所以我打算替换掉 1.下载替换工具 github的项目&#xff0c;看起来很多人对微软默认字体带版权深恶痛绝。 项目地址&#xff1a;nomeiryoUi地址 这里选取最新的版本即可 2.打开软件 这里显示标题栏不能改&#xff0c;确认&#xff0c;其…

盖雅技能发展云,助力制造企业人效合一

制造行业尽管经历多次变革&#xff0c;但企业对人的管理始终是一项高度依赖经验和耗费人力的工作。随着供应链管理和生产设备的自动化、数字化升级&#xff0c;如何将第一生产要素——人&#xff0c;通过数字化的工具融入制造过程的闭环&#xff0c;对企业实现自动化工厂和智能…

力扣 滑动窗口题目总结

Leetcode3.无重复字符的最长子串 思路&#xff1a; 这道题主要用到思路是&#xff1a;滑动窗口 什么是滑动窗口&#xff1f; 其实就是一个队列,比如例题中的 abcabcbb&#xff0c;进入这个队列&#xff08;窗口&#xff09;为 abc 满足题目要求&#xff0c;当再进入 a&#x…