React入门(十四)之webpack

一、webpack

umi官方文档

dva官方文档

Umi 是蚂蚁金服的底层前端框架,dva是数据流方案,同时内置了 react-router 和 fetch,有兴趣点击链接了解。

今天重点是webpack。

1.1、介绍webpack

webpack是一个工具,功能包括打包、模块管理等等。可以参考webpack中文文档

1.2、项目中使用

1.2.1、安装

和谐版本号:

"devDependencies": {
    "@babel/core": "^7.13.10",
    "@babel/preset-env": "^7.13.10",
    "babel-loader": "^8.2.2",
    "css-loader": "^5.1.3",
    "sass-loader": "^8.0.2",
    "node-sass": "^4.14.1",
    "file-loader": "^6.2.0",
    "html-webpack-plugin": "^4.5.0",
    "style-loader": "^2.0.0",
    "url-loader": "^4.1.1",
    "webpack": "^4.46.0",
    "webpack-cli": "^3.3.12",
    "webpack-dev-server": "^3.11.0"
  }

全局环境

npm i webpack webpack-cli -g

项目环境

npm i webpack webpack-cli --save-dev

1.2.2、打包

执行:  webpack 
//默认 会自动找src/index.js 到 dist/main.js

//要求设置开发模式|生产模式
执行:  webpack --mode development | production

//指定出入口
webpack 入口文件路径 --mode development  出口文件路径

入口文件路径:要打包那个文件

出口文件路径:打包到何处,以及文件名

在打包时,我们 一般会把配置写在一个单独的文件里,并且每个项目根目录下都必须配置有一个 webpack.config.js ,它的作用是告诉 webpack 它需要做什么。

1.2.3、webpack.config.js文件示例

var webpack = require('webpack');

module.exports = {
     mode: 'production', //production  区别环境
     entry:  {     }, //页面入口文件配置
     output: {     },  //文件输出配置
     module: {        //加载器配置
         rules: [ ]
     },
     resolve: {     } //其它解决方案配置
     plugins: {     } // 插件
} 

1.2.4、webpack.config.js配置解释

mode:

  mode: 'production', //development  区别环境  	

entry:

​ 是页面入口文件配置。可以是字符串,也可以是对象

//1、字符串:
   entry: "./src/index.js", //入口文件,需要打包的入口文件
               
//2、对象
//  会创建多个入口包。key就是 块(chunk)名字。value就是一个字符串或者一个数组
    entry: {
        page1: "./page1.js",//入口文件
        page2: "./page2.js"//入口文件
    }

output:

是对应输出项配置,表示入口文件最终要生成什么名字的文件、存放到哪里,其语法为:

 entry: {
        page1: "./page1.js",//入口文件
        page2: "./page2.js"//入口文件
 },
 //output必须是个对象
 output: {
        path: __dirname+"/dist/",
        filename: "js/[name].bundle.js"
 }
该段代码最终会生成一个 page1.bundle.js 和 page2.bundle.js,并存放到 ./dist/js/

module.rules:

​ 可以配置loader,loader类似一种转化器, 它可以把一个东西,转成另一个,webpack本身只支持javascript文件模块化,其他文件如需模块化,需要转换器(loader,加载器),loader都需要安装

即:告知 webpack 每一种类型的文件都需要使用什么模块加载器来处理:

style-loader:

编译好的css文件插到页面, 遍历 CSS 文件,然后找到 url() 表达式然后处理,即负责解读,处理css中路径引用等问题,加载css文件

npm install style-loader -D

css-loader:

读取css文件,模块化, 把 CSS 代码插入页面中的一个 style 标签中 。

npm install css-loader -D

url-loader:

​ 把模块化引入的文件(如:图片),转换base64。对未设置或者小于limit设置的图片进行转换,以base64的格式,被img标签的src所使用

npm install url-loader -D

file-loader:

模块化引入文件,大于limit byte的图片用进行解析。url-loader是对file-loader的上层封装

npm install file-loader -D

babel-loader:

优雅降级, es6+ 转换 es5,与他同款还有tracuer

npm install babel-loader @babel/core @babel/preset-env -D

@babel/core 核心

@babel/preset-env 解析目标 es6+ 包

配置:

module: {
    rules: [        //加载器配置   
	         { //.css 文件使用 style-loader 和 css-loader 来处理
                 test: /\.css$/, 
                 loader: 'style-loader!css-loader' 
             }, 
        
            { //.scss 文件使用 style-loader、css-loader 和 sass-loader 来编译处理
                test: /\.scss$/, 
                loader: 'style!css!sass?sourceMap'
            },
        
            { //图片文件使用 url-loader 来处理,小于8kb的直接转为base64
                test: /\.(png|jpg)$/, 
                loader: 'url-loader',
                 options: {
                    limit: 5000,//
                    // outputPath:'images/',//输出的文件路径
                    name:'images/[name]-[hash:8].[ext]'
                 }
            },
        
            {
                test:/\.js$/,
                exclude:/node_modules/, //排除掉js文件
                loader:'babel-loader',
                options:{ //相关配置 可以配置在webpack.config 亦可以配置在.bablerc
                    presets: ['@babel/preset-env']
                }
            }
        ]
 }

babelrc

{
  "presets": [
    "@babel/preset-env"
  ]
}

resolve:

​ Resolve 定义文件名后缀,省略引入时输入后缀。定义别名

resolve: {
    extensions: ['', '.js', '.json', '.scss'],//可以省略的后缀名
    alias: { //模块别名定义,方便后续直接引用别名,
		  '@': path.resolve(__dirname,'src'),
          '~': path.resolve(__dirname,'public')
	}
}

插件(plugins)

所有的插件,都都需要安装,引入,在plugins选项里面实例化

1.2.5、html-webpack-plugin

产出html,动态给单页html做拷贝,及注入的工作

安装

npm i html-webpack-plugin -D

引入

//webpack.config.js
var HtmlWebpackPlugin = require('html-webpack-plugin');//插件==类

配置plugins

module.exports = {
  plugins:[
    new HtmlWebpackPlugin({
      // title:'HTML标题',//html 浏览器的标题
      filename:'index.html',//输出到dist的文件名
      template:'./public/index.html',//要参考的html模板
      hash:true, //防止缓存,会给文件后面加入hash
      minify:{
        //是否去除空格,默认false
        collapseWhitespace: true,
        
        //是否压缩html里的css(使用clean-css进行的压缩) 默认值false;
        minifyCSS: true,
        
        //是否压缩html里的js(使用uglify-js进行的压缩)
        minifyJS: true,
        
        //是否移除注释 默认false
        removeComments: true,
      },
      favicon:'./public/favicon.ico',//配置网址图标
    })
  ]
}

1.2.6、webpack-dev-server

搭建前端开发环境服务器,可以在开发环境下,浏览器热刷新,模块热重载(增量构建机制),默认自动打包(放到内存),创建前端开发型服务器(默认找webpack.config所在的位置,找index.html)

配置

//scripts 命令行
"scripts": {
    "start": "webpack-dev-server --port 8080 --open --mode development"
},
//webpack.config.js配置文件
devServer:{
    port: 8081,//端口
    open: false, //开浏览器
    // contentBase: path.join(__dirname,'public'), //静态资源|html 托管位置
    inline:true, //浏览器热刷新
    // host:'127.0.0.1'  //主机地址
    // https: false , //开启https服务器,需要提供签名文件
    // progress: true, //开启打包进度
    proxy:{
      '/api':{
        target:'http://localhost:9001',
        /* pathRewrite:{
          '^/api': ''
        } */
      },
      '/douban':{
        target:'https://douban.uieee.com',
        pathRewrite:{
          '^/douban':''
        },
        secure: false //接受https的代理
      }
    },
    // watchContentBase: true, //监听public下的文件变动
  }

1.2.7、devtool

使用webpack打包后,代码的错误是按照打包后的文件的行号进行报错的。如果想按照源代码的行号,使用devtool,把代码错误指定到src源代码中

module.exports={
  devtool:'inline-source-map'
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Webpack 是一个常用于打包 JavaScript 应用程序的工具,它的主要作用是将多个 JavaScript 文件打包成一个或多个文件,并且可以处理其他资源文件,如 CSS、图片等。在实际开发中,随着项目规模的增大,Webpack 打包速度、体积等问题就会变得越来越重要,因此,Webpack 优化也成为一个不可忽视的问题。 以下是一些常见的 Webpack 优化方法: 1. 减少文件搜索范围 Webpack 会遍历整个项目目录来查找符合要求的文件,这个过程会消耗大量的时间和资源。我们可以通过配置 resolve.modules 和 resolve.extensions 来减少搜索范围,从而提升打包速度。 2. 使用 Tree Shaking Tree Shaking 是指通过静态分析,将代码中用不到的部分去除,只打包项目中实际被使用的代码。这样可以减少打包后的文件体积。在实际开发中,我们可以使用 webpack.optimize.UglifyJsPlugin 和 webpack.optimize.AggressiveMergingPlugin 等插件来实现 Tree Shaking。 3. 使用 Code Splitting Code Splitting 是指将应用程序拆分成多个 bundle,使得每个 bundle 只包含应用程序的一部分功能,从而减少每个 bundle 的体积,提高加载速度。在实际开发中,我们可以使用 Webpack 自带的代码拆分功能,或者使用第三方库如 react-loadable、bundle-loader 等来实现 Code Splitting。 4. 使用缓存 Webpack 默认会将每个文件的 Hash 值作为文件名的一部分,这样可以保证文件内容发生变化时,文件名也会发生变化,从而避免浏览器缓存问题。但是,如果没有改变的文件也每次都重新打包,就会导致打包速度变慢。因此,我们可以使用缓存来提高打包速度。在 Webpack 中,我们可以使用 cache-loader 和 hard-source-webpack-plugin 等插件来实现缓存。 5. 使用 CDN 加速 通过使用 CDN(内容分发网络),可以将静态资源文件分发到全球各地的服务器上,从而提高文件加载速度。在 Webpack 中,我们可以使用 HtmlWebpackPlugin 和 Webpack 自带的 publicPath 配置来实现 CDN 加速。 以上是一些常见的 Webpack 优化方法,当然还有很多其他的优化方法,需要根据具体情况进行选择和实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值