深入webpack学习 devServer babel-loader asset

Posted lin-fighting

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入webpack学习 devServer babel-loader asset相关的知识,希望对你有一定的参考价值。

开发服务器

 //配置开发服务器
    devServer: 
      static: 
        //真实的含义:配置额外的静态文件的目录,相当于express的开放静态资源目录,可以从浏览器从http://localhost:8080/xx.jpg
        //就是来static文件中寻找的。
        //contentBase: path.resolve(__dirname, "static"),
        // static: ['static']
        directory: path.join(__dirname, "static"),
        publicPath: "/dist",
      ,
      compress: true, //启动压缩gzip
      port: 8080, //端口号
      open: true, //启动之后自动打开浏览器
      hot: true, //配置模块热更新
    ,

路径配置

类别配置名称描述
outputpath指定输出到硬盘上的目录
outputpublicPath表示的是打包生成后的index.html文件中引用资源(js)的前缀,也是公开的路劲,表示我们应该以什么路径访问打包后的静态文件。
devServerstatic下的publicPath表示我们应该以什么路劲访问static.directory。
outputstatic.directory(替代contentBase)用于配置提供二外静态文件内容的目录(类似后端开放静态资源的目录,http://localhost:8080/xx.png就会来这个指定的目录寻找。)


相当于开启另一个静态服务,从浏览器访问的时候会先从dist目录下寻找,没有再去static目录下寻找。

这里可以通过localhost:8080/xx去访问static下的目录,默认值是’’。
配置static.publicPath



只能通过指定的路径去访问静态资源文件。

那output的publicPath又有什么用?

默认是’/’,表示公开的访问路劲。

这个配置表示我们只能以localhost:8080/static来访问打包后的文件。


为什么配置这个呢?
因为一般我们的css,js文件都是放在CDN上的,所以这个publicPath一般是来配置csdn的地址的。

总结:

output的path用来决定打包后的文件的位置。output的publicPath用来决定以什么路径访问打包后的文件。
devServer的static.directory用来开启另外的静态资源服务,而devServer的static.publicPath用来决定以什么路径访问这个另外的静态资源服务.
目前总的代码:

const path = require("path");
const webpack = require("webpack");
const HtmlWebpackPlugin = require("html-webpack-plugin");
module.exports = (env, args) => 
  const isProducetion = env.production;
  const isDevelopment = env.development;
  console.log(process.env.REACT_APP);
  return 
    //entry: './src/index.js',
    // 出口
    mode: "development",
    entry: 
      //可以是 main: [],//会一起打包。
      index: "./src/index.js", //源文件只能是源目录里面的文件。可以是相对路劲,也可以是绝对路劲。
    ,
    // 入口,
    output: 
      path: path.resolve(__dirname, "dist"), //必须是绝对路劲, 打包后输出的文件可以是硬盘的任意位置
      filename: "[name].js",
      publicPath: "/static", //
    ,

    //配置开发服务器
    devServer: 
      static: 
        //真实的含义:配置额外的静态文件的目录,相当于express的开放静态资源目录,可以从浏览器从http://localhost:8080/xx.jpg
        //就是来static文件中寻找的。
        //contentBase: path.resolve(__dirname, "static"),
        // static: ['static']
        directory: path.join(__dirname, "static"),
        publicPath: "/dist",
      ,
      compress: true, //启动压缩gzip
      port: 8080, //端口号
      open: true, //启动之后自动打开浏览器
    ,

    //处理js和json之外的文件,要想让webpack认识,必须配置Loader
    // loader加载器可以把webpack不认识的模块转换成webpack认识的模块
    module: 
      rules: [
        
          test: /\\.txt$/,
          use: ["raw-loader"],
        ,
      ],
    ,

    //插件
    plugins: [
      //在输出目录自动生成html文件,并插入打包后的脚本
      new HtmlWebpackPlugin(
        //模板
        template: "./src/index.html",
        filename: "index.html",
      ),
      //配置全局变量
      new webpack.DefinePlugin(
        "process.env.NODE_ENV1": JSON.stringify(
          isDevelopment ? "development" : "production"
        ),
        test: JSON.stringify(isDevelopment ? "development" : "production"),
      ),
    ],
  ;
;

打包其他资源

webpack5之后可以不使用url-loader,raw-loader,file-loader了。
可以使用配置:资源模块类型(asset module type),它允许使用资源文件(字体,图片)等,而无需配置其他的loader。
有四种可选的值:

  • 1 asset/resource 发送一个单独的文件并导出URL,替代file-loader
  • 2asset/inline 导出一个资源的data URL,替代url-loader
  • 3asset/source 导出资源的源代码,之前通过使用raw-loader实现。
  • 4 asset在导出一个data URL和发送一个单独的文件之间做选择,之前通过url-loader+limit属性实现。
    具体使用:

    使用第三种,代替raw-loader
    使用assest/inline代替url-loader,可以把小图片变成base6字符串嵌套在页面中。


    使用asset/resource代替file-loader。打包出


使用generator可以配置额外的信息,比生成文件的位置。
使用:asset,来代替url-loader+limit的效果:

将大于10kb的文件打包出去,小于10kb转成base64的字符串。

引入图片的几种方式

  • 1 require(’./xxx.jpg’)
  • 2 使用css backgound-image: url(’./xxx.jpx’)
  • 3 import style from ‘./xx.jpg’
  • 4 直接在img标签使用(在html中使用的时候需要html-loader)


总结:

webpack5使用asset module type来打包其他的资源,一共有四种:
asset/inline(url-loader) 将资源转换城64位字符串嵌入页面
asset/resource(file-loader) 将资源额外打爆出来
asset/source(raw-loader) 将资源的源代码直接导出,嵌入页面
asset(url-loader+limit)将大于最大值的资源额外打包,将小的资源转成64位字符串嵌入页面
他们都可以通过额外的配置比如打包后的文件名,位置等等。

babel-loader

es6,es7,甚至更高的代码无法在浏览器正常运行,所以需要转化成es5的代码,babel就是来做这个事情的。
下面是使用babel转化代码的三个核心:

  • babel-loader //可以让webpack认识的
  • @babel/core // babel的核心代码
  • @babel/preset-env //告诉babel怎么转化。
  • 三者的关系可以抽象为,babel-loader就是一个厨房重地,而@babel/core是转换代码的引擎,把它比喻成厨师。而@babe/preset-env预设就好比菜谱。如果没有厨房,厨师有了菜谱也不能做菜。没有菜谱,厨师在厨房内也无法做菜,只能做一些简单的菜式(转换一些简单的代码)。没有厨师更加无法做菜了(无法转换代码),所以三者缺一不可。

用伪代码表示就是:

function BabelLoader(soruceCode) //babelloader就是babel-loader
					//babelCode就是@babel/core,转换器
		let targetSource = babelCore.transform(sourceCode,  presets: ['@babel/preset-env'])  //预设
		return targetSource

所有的webpack loader本质就是一个函数,用于接受原来的内容,返回新的内容。
预设有很多种,就好比有很多种菜谱,有支持转换react的,有支持转换装饰器的,有支持转换vue的等等。

babel-profill

eslint

使用vscode的内置插件
安装


在根目录下创建.vscode文件夹,再创建settings.json文件。
里面用来存放Vscode的配置规则。


    //eslint的配置
    "eslint.validate": [
        "javascript",
        "javascriptreact",
        "typescript",
        "typescriptreact",
    ],
    //文件的保存默认保存格式
    "[typescriptreact]": 
        "editor.defaultFormatter": "esbenp.prettier-vscode"
    ,
    "[typescript]": 
        "editor.defaultFormatter": "esbenp.prettier-vscode"
    ,
    "[javascript]": 
        "editor.defaultFormatter": "esbenp.prettier-vscode"
    ,
    "[javascriptreact]": 
        "editor.defaultFormatter": "esbenp.prettier-vscode"
    ,
    //css的验证开启
    "css.validate": true,
    "less.validate": true,
    "scss.validate": true,

    //保存格式化
    "editor.formatOnSave": true,
    //在保存时运行的代码操作类型。
    "editor.codeActionsOnSave": 
        "source.fixAll.eslint": true,
        "source.fixAll.stylelint": true,
    
   

像这样配置完毕,当我们代码自动保存的时候就会自动格式化了。

这是vscode对代码格式的防线

eslint-loader对代码的防线

在webpack里面,loader是有类别的,分为

  • pre 前置
  • normal 正常
  • inline 内联
  • post 后置
    先走pre,再normal,再inline,再post
    cnpm i eslint eslint-loader babel-eslint -D

    新建一个.eslintrc.js文件

    这样在我们有不合规范的代码的时候就会报错。这是代码检查的另一道防线,与vscode的无关。

以上是关于深入webpack学习 devServer babel-loader asset的主要内容,如果未能解决你的问题,请参考以下文章

深入浅出的webpack构建工具---webpack基本配置

Webpack 配置

webpack中devServer的使用及其他配置

开发服务器devServer配置(webpack)

webpack devServer配置项的坑

webpack5之devServer