【webpack】 如何配置eslint+babel+ts

平时用 cra、vue-cli等cli工具用多了,并不知道webpack是怎么是怎么配置,所以想深入了解下,顺便也了解下同样的需求,用vite是怎么做的

老牌工具 webpackRollupParcel

webpack

这是webpack 一般的配置的结构,这里只讲webpack。它通常有moderesolveoutputentrymoduleplugins 等配置

js 复制代码
// webpack
webpack webpack-cli

// babel相关依赖
@babel/core  babel-loader  @babel/preset-env  @babel/preset-typescript

// ts相关依赖
typescript ts-loader @typescript-eslint/parser @typescript-eslint/eslint-plugin 

// eslint
eslint eslint-loader  
js 复制代码
const ESLintWebpackPlugin = require("eslint-webpack-plugin");
const path = require("path");

module.exports = {
  entry: "./src/index.ts",
  mode: "development",
  output: {
    path: path.resolve(__dirname, "dist"),
    filename: "[name].js",
  },
  resolve: {
    extensions: [".ts", ".tsx", ".js"],
  },
  module: {
    rules: [
      {
        test: /\.tsx?$/,
        use: [
          {
            loader: "babel-loader",
            options: {
              presets: ["@babel/preset-env"],
            },
          },
          "ts-loader"
        ],
        exclude: /node_modules/,
      },
    ],
  },
  plugins: [
    new ESLintWebpackPlugin({
      extensions: ["js", "mjs", "jsx", "ts", "tsx"],
    }),
  ],
};

以上采用ts-loader去转化ts, ts-loader主要采用使用TypeScript的官方编译器tsc将TypeScript代码编译成JavaScript代码, 配合tsconfig.json一起使用。与babel的预设@babel/preset-typescript不同的是, 前者可以做类型检查, 后者只是转换,不做类型检查,因为速度快些。如果后者也想使用类型检查,可以配合fork-ts-checker-webpack-plugin一起使用

sql 复制代码
pnpm add --dev fork-ts-checker-webpack-plugin

采用@babel/preset-typescriptfork-ts-checker-webpack-plugin结合的配法

js 复制代码
module: {
   rules: [
     {
       test: /\.tsx?$/,
       use: [
         {
           loader: "babel-loader",
           options: {
             presets: ["@babel/preset-env","@babel/preset-typescript"],
           },
         },
       ],
       exclude: /node_modules/,
     },
   ],
 },
 plugins: [
   new ForkTsCheckerWebpackPlugin(),
   new ESLintWebpackPlugin({
     extensions: ["js", "mjs", "jsx", "ts", "tsx"],
   }),
 ],

也可以使用ts-loaderfork-ts-checker-webpack-plugin结合,但是需要将transpileOnly设置为true, ts-loader < 9.3.0 手动添加transpileOnly>=9.3.0 自动添加 transpileOnly 为true, 详见transpileonly

js 复制代码
const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin');

module: {
   rules: [
     {
       test: /.tsx?$/,
       loader: 'ts-loader',
       // add transpileOnly option if you use ts-loader < 9.3.0 ,
       // options: {
       //   transpileOnly: true
       // }
     }
   ]
 },
 plugins: [new ForkTsCheckerWebpackPlugin()],

tsconfig.json

json 复制代码
{
  "compilerOptions": {
    "outDir": "./dist"
    "declaration": true, // 会生成.d.ts 文件
    "esModuleInterop": true,
    "module": "commonjs",
    "moduleResolution": "node",
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "strict": true,
    "skipLibCheck": true,
    "target": "es2019",
    "jsx": "react",
    "lib": ["dom", "dom.iterable", "esnext"]
  },
  "exclude": ["**/node_modules"]
}

eslintrc.js

js 复制代码
module.exports = {
  parser: "@typescript-eslint/parser",
  plugins: ["@typescript-eslint"], //  需要安装的依赖是 @typescript-eslint/eslint-plugin
  extends: ["eslint:recommended", "plugin:@typescript-eslint/recommended"],
  parserOptions: {
    ecmaVersion: 2020,
    sourceType: "module",
    ecmaFeatures: {
      jsx: true,
    },
  },
};

新版工具

vite: 生产构建依赖Rollup

swc

es-build 基于go

rspack 基于rust

vite

这里只讲vitevite 天然支持.ts, 与ts-loader不同的是,内部采用esbuild来转换JavaScript,不做类型检查, 据说构建速度比tsc20-30倍。 Vite 建议将转换和类型检查分开,详见vite typescript

  • 在构建生产版本时,你可以在 Vite 的构建命令之外运行 tsc --noEmit。 这个命令的作用是制作类型检查,不输出编译后代码
  • 在开发时,如果你需要更多的 IDE 提示,我们建议在一个单独的进程中运行 tsc --noEmit --watch

所以我们只需要安装eslint的配置

eslintrc.js ,和上面差不多

js 复制代码
module.exports = {
  parser: "@typescript-eslint/parser",
  plugins: ["@typescript-eslint"],
  extends: ["eslint:recommended", "plugin:@typescript-eslint/recommended"],
  parserOptions: {
    ecmaVersion: 2020,
    sourceType: "module",
    ecmaFeatures: {
      jsx: true,
    },
  },
};

vite.config.js

js 复制代码
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [vue()],
})
相关推荐
鑫~阳33 分钟前
html + css 淘宝网实战
前端·css·html
Catherinemin37 分钟前
CSS|14 z-index
前端·css
2401_882727572 小时前
低代码配置式组态软件-BY组态
前端·后端·物联网·低代码·前端框架
NoneCoder2 小时前
CSS系列(36)-- Containment详解
前端·css
anyup_前端梦工厂3 小时前
初始 ShellJS:一个 Node.js 命令行工具集合
前端·javascript·node.js
5hand3 小时前
Element-ui的使用教程 基于HBuilder X
前端·javascript·vue.js·elementui
GDAL3 小时前
vue3入门教程:ref能否完全替代reactive?
前端·javascript·vue.js
六卿3 小时前
react防止页面崩溃
前端·react.js·前端框架
z千鑫3 小时前
【前端】详解前端三大主流框架:React、Vue与Angular的比较与选择
前端·vue.js·react.js
m0_748256144 小时前
前端 MYTED单篇TED词汇学习功能优化
前端·学习