webpack之postcss babel eslint 以及服务器代理

276 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情

postcss

css兼容性处理: 需要借助一个很重要的工具,postcss

pnpm install postcss  postcss-loader postcss-preset-env -D

postcss.config.js:

const postcssPresetEnv = require("postcss-preset-env");
module.exports = {
  plugins: [
    postcssPresetEnv({
      // 支持最新的五个版本
      browsers: "last 5 version",
    }),
  ],
};

这里就不得不再提及一下前面我们css-loader的一个选项:importLoaders: 在我们设置该选项的值为一个数字的时候,我们在css文件里面如果加载了其他css,比如@import url这种形式,那么如果这个数字为0,或者设置为false了。那么我们不会对导入的css应用css-loader前面的loader进行处理:比如 postcss-loader

babel

安装会用到的一些库:

pnpm install babel-loader @babel/core @babel/preset-env @babel/preset-react -D
pnpm install @babel/plugin-proposal-decorators @babel/plugin-proposal-class-properties @babel/plugin-proposal-private-property-in-object @babel/plugin-proposal-private-methods -D

babel-loader 的配置:

{
  test: /\.jsx?$/,
  use: {
    loader: "babel-loader",
    // 配置
    options: {
      // 配置预设
      presets: ["@babel/preset-env", "@babel/preset-react"],
      // 插件
      plugins: [
        [
          // 支持装饰器
          "@babel/plugin-proposal-decorators",
          // 插件的参数
          // legacy 表示使用旧的装饰器语法
          { legacy: true },
        ],
        [
          // 类属性
          "@babel/plugin-proposal-class-properties",
          { loose: true },
        ],
        [
          // 私有方法
          "@babel/plugin-proposal-private-methods",
          { loose: true },
        ],
        [
          // 私有属性
          "@babel/plugin-proposal-private-property-in-object",
          { loose: true },
        ],
      ],
    },
  },
},

babel 是一个语法转换的引擎,具体的转换规则是由插件决定的。每个插件可以转换一个语法。 但是插件一个个的配置比较麻烦,所以我们出现了预设:也就是多个插件的集合。

装饰器

支持装饰器语法:jsconfig.json

{
  "compilerOptions": {
    "experimentalDecorators": true
  }
}

什么是装饰器:

function readonly(target, key, decorator) {
  // 属性不可重写
  decorator.writable = false;
}

class Number {
  @readonly
  PI = 3.14;
}

const n = new Number();
console.log(n.PI);
n.PI = 22; // 属性不可重写了
console.log(n.PI);

ES Lint

pnpm install -D eslint eslint-loader babel-eslint 
// 配置 eslint
{
  test: /\.jsx?$/,
  // use: {
  loader: "eslint-loader",
  options: {
    enforce: "pre",
    options: { fix: true },
    exclude: /node_modules/,
  },
  // },
},

服务器代理

如果你有单独的后端开发服务器API,并且希望在同域名下发送API请求,那么代理某些URL会很有用。

代理只有在开发模式才有效:

// 开发服务器
devServer: {
  // 额外的 静态资源目录
  static: path.resolve(__dirname, "public"),
  port: 8080, // 端口号
  open: true, // 打包完毕后自动打开浏览器
  proxy: {
    // 配置代理
    // "/api": "http://localhost:7777",
    "/api": {
      target: "http://localhost:7777",
      // 路径重写
      pathRewrite: {
        "^/api": "",
      },
    },
  },
},
// webpack-dev-serve 内部就是一个express服务器 这里可以模拟后端
onBeforeSetupMiddleware(devServer) {
  devServer.app.get("/users", (req, res) => {
    res.json({
      success: true,
      data: {
        name: "zs",
      },
    });
  });
},