【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()],
})
相关推荐
也无晴也无风雨1 小时前
深入剖析输入URL按下回车,浏览器做了什么
前端·后端·计算机网络
Martin -Tang1 小时前
Vue 3 中,ref 和 reactive的区别
前端·javascript·vue.js
FakeOccupational3 小时前
nodejs 020: React语法规则 props和state
前端·javascript·react.js
放逐者-保持本心,方可放逐3 小时前
react 组件应用
开发语言·前端·javascript·react.js·前端框架
曹天骄4 小时前
next中服务端组件共享接口数据
前端·javascript·react.js
阮少年、4 小时前
java后台生成模拟聊天截图并返回给前端
java·开发语言·前端
郝晨妤6 小时前
鸿蒙ArkTS和TS有什么区别?
前端·javascript·typescript·鸿蒙
AvatarGiser6 小时前
《ElementPlus 与 ElementUI 差异集合》Icon 图标 More 差异说明
前端·vue.js·elementui
喝旺仔la6 小时前
vue的样式知识点
前端·javascript·vue.js
别忘了微笑_cuicui6 小时前
elementUI中2个日期组件实现开始时间、结束时间(禁用日期面板、控制开始时间不能超过结束时间的时分秒)实现方案
前端·javascript·elementui