拆分js文件_2021入门Webpack,看这篇就够了:Webpack.config.js 解析

42229770bf8dd7bea6f623aa7206927f.png

这是优妈成长记的第63篇原创

这是一个webpack配置说明

本文是发布在github上webpack-demo的README文件内容。主要对webpack.config.js每一条的注释说明。

github项目地址:https://github.com/hourong88/webpack-demo

可以点击文章最下方【阅读原文】跳转github链接查看,或下载实战代码直接食用。

Run the example

$ npm install
$ npm start

Introduce

这个demo是简单的webpack配置demo,您可以根据实际项目需求,按照下方的配置说明,个性化的配置您的项目。

您也可以关注我,后续会发布最新的依赖的脚手架项目。

This demo is a simple webpack configuration demo, you can personalise your project according to your actual project requirements by following the configuration instructions below.

You can also follow me and I will be posting the latest scaffolding projects with dependencies.

webpack.config.js 配置说明 Configuration instructions

The following comments are in Chinese, you can use the software to translate them.

const path = require('path')

// module.exports = function (webpackEnv) {
    module.exports = {
    //定义生产环境和开发环境
    //开发环境development 和生产环境 production构建目标差异很大
    //开发环境:需要强大的,具有实时重新加载或热模块替换能力,source map 和 localhost server 调试能力
    //生产环境: 我们关注更小的bundle,更轻量的source map,更优化的资源,改善加载时间。
    //所以不同环境配置不同,有倾向性。
    // const isEnvDevelopment = webpackEnv === 'development';
    // const isEnvProduction = webpackEnv === 'production';
    // const publicPath = isEnvProduction ? '/ui/' : isEnvDevelopment && '/';
    
    // return{
        //entry表示入口,webpack构建第一步将从entry开始,输入类型可以抽象为字符串,数组和对象。从入口开始,递归搜寻及解析出所有入口依赖的模块。entry是必填的,否则会报错、退出
        entry: './src/app.js', //可以有一个入口,也可以有多个入口,多个入口对应多个**chunk**,具体写法看中文文档。entry根据构建出来的依赖关系图,从而知道哪些部分将会输出为bundle。
        //什么是chunk?
        //webpack专用术语,用于管理webpack打包进程。chunk和输出的**bundle**一一对应,但是,有些是一对多的关系。
        //如果entry配置的是对象object,可能就会出现多个thunk,这时候thunk名称是对象健值对中健的名称
        //什么是bundle?
        //bundle是已经加载完毕,和被编译后的源代码最终版本。由多个模块产生,一个应用可以拆分为多个bundle。Bundle Splitting是webpack优化代码的一种方法。
        //总之,chunk和bundle都可以拆分,按需加载,减少代码量。
        output: {
            path: path.resolve(__dirname , 'dist'), //输出文件存放的路径
            //filename: isEnvDevelopment ? 'bundle.js' : '[name].js',//输出文件完整名称,即使指定了多个入口点(entry points),output配置项也只能设置一个。
            filename:'bundle.js',
            publicPath: publicPath,//发布到线上,所有资源的URL前缀
            pathInfo:true,//是否包含有用的文件路径信息到生成到代码里,为布尔类型。
            chunkFilename:'[name].js',//chunk文件名称
            sourceMapFilename:'[file].map',//生成到source map文件名称
            devtoolModuleFilenameTemplate: 'webpack:lll[resource-path ]', //浏览器开发者工具显示的源码模块名称
            },
            //配置模块
        module: {
            rules:[
                { //babel es6转es5 兼容 babel-loader 同步的
                //配置模块的读取和解析规则,通常用来配置Loader。对模块源码进行转换
                test: /\.(js|mjs|jsx|ts|tsx)$/,//正则匹配命中要使用loader的文件,通过test、 inc1ude、 exclude三个配置项来选中Loader要应用规则的文件。
                include:[
                    path.resolve(__dirname , 'src') //只会命中这里面的文件
                ],
                exclude: /node_modules/, //忽略这里面的文件
                use: [//使用哪些loader,有先后次序,从后向前执行
                    'style-loader', //直接使用loader名称 scss 文件的处理顺序为先 sass-loader,再 css-loader,再 style-loader
                    {
                        options: {
                        //向html-loader传一些参数
                        },
                        loader: require.resolve('eslint-loader'),
                        //常用loader 分别配置
                        //转换编译:script-loader, babel-loader,ts-loader,coffee-loader
                        //处理样式:style-loader,css-loader,less-loader,sass-loader,postcss-loader(postcss和scss关系类似babel和js)
                        //处理文件:raw--loader,url-loader,file-loader
                        //处理数据:csv-loader,xml-loader
                        //处理模板语言:html-loader,pug-loader,jade-loader,markdown-loader
                        //清理和测试:mocha-loader,eslint-loader
                        //react:babel-preset-react
                    },
                ],
                },  
            ],
            noParse:[ //提高webpack构建性能,忽略没采用模块化的文件递归处理
                //noParse文件不能包含模块化的语句import,require,defind,不然会导致构建文件无法在浏览器浏览
                /lspecial-library\.js$1 //用正则匹配
            ]
        },
        plugins:[
            //配置插件,扩展webpack功能,plugin配置项接收一个数组,数组每一项都是使用一个plugin实例,plugin的参数通过构造函数传入。使用plungin,需要在社区找到plugin本身提供的配置项
        ],
        resolve: { //配置寻找模块的规则
            modules: [ //寻找模块的根目录,为 array 类型,默认以 node_modules 为根目录
            'node_modules',
            path.resolve( dirname, 'app'),
            ],
            extensions: ['.js', '.json', '.jsx', '.css'], //模块的后缀名
            alias :{ //除了可以用对象,也可以用数组进行详细配置
            //将'module’映射成'new-module', 'module/path/file'映射成'new-module/path/file’
            //通过别名映射原来的路径为新路径
            'module':'new-module',
            },
            symlinks: true , // 是否跟随文件的软链接去搜寻模块的路径 
            descriptionFiles: ['package.json'],//模块的描述文件 
            mainFields : ['main'], //模块的描述文件里描述入口的文件的字段名 
            enforceExtension: false, //是否强制导入语句写明文件后缀,如果为true,导入模块必须带后缀
            },
        performance: { //输出文件性能检查配置
            hints: false, // 关闭性能检查
            maxAssetSize: 200000 , // 最大文件的大小(单位为 bytes)
        }, 
        devtool: 'source-map', //用于开发环境调试,生产环境可以不配置
        devServer: {
            contentBase: "./public", //本地服务器所加载的页面所在的目录
            historyApiFallback: true, //不跳转
            inline: true, //实时刷新
            hot: true 
        },
        target: 'web', //浏览器,默认
        profile: true, // 是否捕捉 Webpack构建的性能信息,用于分析是什么原因导致构建性能不佳
        cache : false , // 是否启用缓存来提升构建速度  
    }
// }

//优化

//1.缩小文件搜索范围
//* loader 调整目录结构,include缩小命中范围
//* resolve 定义搜索绝对路径
//* alias 映射新路径
//* extensions: [’js’],尽可能减少后缀尝试搜索的可能性
//* noParse 忽略没用模块化的文件

//2.用dllPlugin
// 动态链接库 antd react charts

//3.HappyPack 分解任务,多线程解析和处理文件 loader最耗时 happypack/loader

//4.自动刷新 watch监听 不监听node_modules

//5.区分环境 开发和生产

//6.压缩代码 uglifyJs 压缩js;cssnano 压缩css

//7.cdn加速

//8.tree shaking 可以用来剔除js中用不上的死代码

//9.提取公共代码,组件 公共代码base.js 所有页面都依赖的基础组件库,entry配置,打包成单独的trunk

//10.分割代码按需加载 import() 返回一个promise,output配置分割出去的thunk名称,在路由或者点击按钮事件里面配置

//11.使用prepack改变源码运行逻辑 plugin 运行时优化

//12.scope hoisting 作用于提升,打包出来的代码更小,运行更快 是一个plugin

//13.输出分析 webpack analyse

//[over]
e911503e0b51671fecc9b2a27e0a5025.gif8eb0c7464f4cd998f63f602e650ccb8c.png

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

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

相关文章

orcad自上而下_开发自上而下的Web服务项目

orcad自上而下这是从Alessio Soldano编辑的Advanced JAX-WS Web Services手册中摘录的示例章节。 第一章介绍了自底向上创建Web服务端点的方法。 它允许非常快地将现有bean作为Web Service端点公开:在大多数情况下,将类转换为端点只需在代码中添加少量注…

安装win7系统不能开机启动服务器,win7系统开机启动项不能加载的原因分析及解决...

开机启动项是每台电脑都有的东西,就是多和少的问题的,很多人开机的时候喜欢加载很多的启动项,其实这也没什么不好的。现在的电脑为了受到更好的保护,往往在开机的时候就加载了一些启动项,如:杀毒软件&#…

4 指针运算_C++用指针访问数组元素(学习笔记:第6章 08)

用指针访问数组元素[1]数组是一组连续存储的同类型数据,可以通过指针的算术运算,使指针依次指向数组的各个元素,进而可以遍历数组。定义指向数组元素的指针定义与赋值例:int a[10], *pa; pa&a[0]; 或 paa;等效的形式经过上述定…

属性面板 脚本_3.1 创建和使用脚本

在unity中,游戏物体的行为是通过组件来驱动的,我们可以通过内建的组件来给我们的游戏物体组合各种能力,尽管如此,要知道我们的需求永远是动态的,很快我们就会发现,内建的组件功能已经无法满足我们的需求&am…

vue加跨域代理静态文件404_解决vue本地环境跨域请求正常,版本打包后跨域代理不起作用,请求不到数据的方法——针对vue2.0...

问题:在本地使用了proxyTable代理可以正常跨域请求后台数据,打包上传后就无法获得后台的json文件。查看了相关资料可以用nginx进行解决。还可以使用命名环境变量,请求的时候进行判断,话不多说上干货module.exports merge(prodEnv…

tomee_使用Vysper,TomEE和PrimeFaces将XMPP服务器嵌入JSF Web应用程序内部

tomee我有一个需要在完成某些工作时通知用户的应用程序。 它使用JSF和Primefaces,因此可以使用大气 (也称为Push)来实现这种通知。 但是另一个有趣的方法是使用嵌入在Java Web应用程序中的XMPP服务器。 好的,好的,您不…

板框导入_板框结构导入有问题?这几个问题最常见,附解决方法!

对于一些比较复杂的结构,Altium的处理能力有限,通常采用AutoCAD来进行设计,然后在Altium中执行菜单栏中“文件”→“导入”→DWG/DXF命令,选择需要导入的DXF文件即可。如果导入过程中出现了乱码,报错等问题要如何解决呢…

您如何使用硒来计算自动化测试的投资回报率?

跨浏览器测试是一种测试,需要大量的精力和时间。 通过不同的浏览器,操作系统,设备,屏幕分辨率测试Web应用程序,以评估针对各种受众的Web内容呈现的过程是一项活动。 特别是如果手动处理。 使用Selenium进行的自动跨浏览…

流量复制_详解Linux系统流量复制--gor、tcpcopy、nginx模块流量复制等

概述对于一些有并发要求的业务,特别是对接外部流量时,产品上线前一定要做的就是压力测试,但是常规的压力测试并不能覆盖所有情况。以gemeter、ab,、webbench、http_load为例,这些通过模拟请求的压测工具,只能发送特定的…

C语言天才!想法奇异?还是逼格满满?一份国外C语言写的传奇简历

C语言天才!想法奇异?还是逼格满满?一份国外C语言写的传奇简历作者用代码更新了自己的简历,是不是很接地气,特符合程序员的逼格。这是一份可读可执行的语言源文件,也是作者编码风格的体现。C语言源码&#x…

hash值 更改git_Git切换版本

Git切换版本有三种方式:1.基于哈希值切换》基于哈希值切换(推荐),命令:git reset --hard 哈希值,哈希值从哪来,git reflog查看下就知道了,切换版本后,git reflog会发现有两个HEAD,别…

fedora mysql_Fedora server 安装Mysql8

导读MySQL是一种关系数据库管理系统(RDBMS),作为服务器运行,提供对多个数据库的多用户访问。 这是指导,如何在Fedora 28/27/26,CentOS 7.5 / 6.10和Red Hat(RHEL)7.5 / 6.10上安装或升级MySQL社区服务器最新版本8.0(8.0.12)/5.7(5…

lombok 生成代码_使用Project Lombok减少Java应用程序中的样板代码

lombok 生成代码对Java编程语言最常提出的批评之一是它需要大量的样板代码 。 对于简单的类尤其如此,该类只需要存储一些值就可以。 您需要这些值的getter和setter方法,也许您还需要一个构造函数,覆盖equals()和 hash…

让C/C++程序员告诉你什么叫浪漫,表白黑科技,炫酷多彩求爱利器

前言缘是美丽的邂逅,爱是心跳的感觉,情是心灵的交会,恋是甜蜜的思念,走在爱与被爱的边缘,你见或者不见,爱你的心始终不改变!C语言诠释爱——为TA写下心中情,生成程序传给TA&#xff…

Java十六进制浮点文字

我如何遇到十六进制浮点数 我正在Java :: Geci中开发一种新功能,以减少代码重新格式化的可能性。 如果重新格式化,当前版本的代码将覆盖原本相同的代码。 这很烦人,因为按下重新格式化键的快捷键相当容易,而且许多项目甚至要求开发…

C语言对电脑做的事儿啊,总有那么一丝恐怖,C语言操盘电脑两例

C语言对自己电脑做的事儿啊,总有那么一丝恐怖,C语言与电脑两例开场先抱歉,偷懒好多天了。今天分享给大家的l两例比较短小精悍,都是针对于计算机屏幕处理的两例,有兴趣的可以放到自己电脑上运行哦。绝对无害&#xff0c…

servlets_jQuery Ajax – Servlets集成:构建完整的应用程序

servlets网上有很多教程,它们解释了有关使用servlet和JSP页面进行Java Web开发的一些知识,但是,我从未找到对于初学者来说足够简洁的教程。 这样的教程应该解释创建一个简单的Web应用程序的整个过程,包括前端,后端&…

mysql分库分表的缺点_MySQL分库分表会带来哪些问题?

分库分表能有效的环节单机和单库带来的性能瓶颈和压力,突破网络IO、硬件资源、连接数的瓶颈,同时也带来了一些问题。下面将描述这些技术挑战以及对应的解决思路。1、事务一致性问题分布式事务当更新内容同时分布在不同库中,不可避免会带来跨库…

C语言的恶趣味,胆小者莫入,以免入门到放弃,C语言夺命题十例!

前言这些问题测试了C语言的高级知识,包括一些很少使用的特性。有效的C编程需要对诸如未定义的行为,递归和指针算术等概念有深入的理解,但是这些故意复杂的例子并不代表现实世界的代码,当然也不会为了清晰和可维护性而获得任何奖励…

java学习里程碑_记录您的里程和社区运行情况:Java EE 7真实体验

java学习里程碑miles2run.org是跟踪跑步活动并与亲朋好友共享的简便方法。 可以创建然后跟踪基于天或基于距离的目标。 它还允许创建社区运行目标,并使多个跑步者参与并跟踪他们朝着该目标的活动。 您还可以找出本地跑步者并与他们联系。 该项目已开始,…