rollup + typesricpt + babel + jest 环境配置

1,345 阅读4分钟

搭建项目

安装core-js

npm i --save core-js 

yarn add core-js

安装rollup

rollup:打包工具,和webpack齐名

npm i --save-dev @rollup/plugin-commonjs @rollup/plugin-node-resolve rollup  rollup-plugin-dts rollup-plugin-terser

yarn add --dev @rollup/plugin-commonjs @rollup/plugin-node-resolve rollup  rollup-plugin-dts rollup-plugin-terser

介绍一下,这些包的用途

  • @rollup/plugin-commonjs 用于将commonjs包转换为ESM模块包(建议安装)
  • @rollup/plugin-node-resolve 用于解析node模块(建议安装)
  • rollup 打包工具,类似webpack,不过更适用于打包库
  • rollup-plugin-dts 用于打包时生成d.ts文件(建议安装,有d.ts可以更好的在ide中进行语法提示)
  • rollup-plugin-terser 用于打包时压缩代码体积(如果不想压缩代码体积,可以选择不安装)

安装typescript

typescript:具备类型检查的JavaScript子集

npm i --save-dev typescript

yarn add --dev typescript

安装babel(不使用babel可以跳过)

babel:用于源代码转译,方便对低版本NODE或者浏览器环境进行兼容

npm i --save-dev @babel/core @babel/plugin-external-helpers @babel/plugin-transform-runtime @babel/preset-env @babel/preset-typescript @rollup/plugin-babel
npm i --save @babel/runtime

yarn add --dev @babel/core @babel/plugin-external-helpers @babel/plugin-transform-runtime @babel/preset-env @babel/preset-typescript @rollup/plugin-babel
yarn add @babel/runtime

介绍一下,这些包的用途

  • @babel/runtime 用于被babel转译后的代码实现源代码同样的功能
  • @babel/core babel核心库,使用babel必安装的包
  • @babel/plugin-external-helpers 避免多次引入helpers
  • @babel/plugin-transform-runtime 用于转译源代码至指定ES版本
  • @babel/preset-env babel多环境转译预设
  • @babel/preset-typescript babel转译typescript预设
  • @rollup/plugin-babel 用于rollup打包时调用babel进行源代码转译

安装 eslint(不使用eslint可以跳过)

eslint:用于代码风格检查

npm i --save-dev eslint @typescript-eslint/eslint-plugin @typescript-eslint/parser

yarn add --dev eslint @typescript-eslint/eslint-plugin @typescript-eslint/parser

介绍一下,这些包的用途

  • eslint 代码风格检查工具
  • @typescript-eslint/eslint-plugin typescripteslint插件
  • @typescript-eslint/parser typescripteslint解析器

安装 prettier(不使用prettier可以跳过)

prettier:用于格式化代码

npm i --save-dev prettier eslint-config-prettier

yarn add --dev prettier eslint-config-prettier

介绍一下,这些包的用途

  • prettier 代码格式化工具
  • eslint-config-prettier eslintprettier配置预设,用于避免eslintprettier格式化代码时冲突

安装 jest(不使用jest可以跳过

jest:用于测试代码

npm i --save-dev jest ts-jest @jest/globals @types/jest

yarn add --dev jest ts-jest @jest/globals @types/jest

介绍一下,这些包的用途

  • jest js代码测试工具,类似java中的junit
  • ts-jest 用于在测试中将ts代码编译为js(使用tsc进行编译)
  • @jest/globals 包含了Jest全局函数定义

项目配置

配置package.json

package.json中添加以下内容

"scripts": {
    "build": "rollup -c "rollup.config.js"",
    "lint": "eslint src/**/*.{js,ts}",
    "format": "prettier --write "src/**/*.ts" "src/**/*.js"",
    "test": "jest --no-cache --config jest.config.js"
},
"type": "module",
"types": "./dist/pangju-utils.d.ts",
"exports": {
    "require": "./dist/pangju-utils.cjs",
    "default": "./dist/pangju-utils.esm.js"
},
"main": "./dist/pangju-utils.cjs",
"module": "./dist/pangju-utils.esm.js",
"unpkg": "./dist/pangju-utils.umd.js",
"files": [
    "dist"
],

配置typescript

在根目录创建ts.config.json,并添加以下内容

{
  "compilerOptions": {
    "baseUrl": ".",
    // 输出目录
    "outDir": "./dist",
    // 是否生成sourceMap
    "sourceMap": false,
    // 编译目标
    "target": "ES5",
    // 模块类型
    "module": "ES6",
    "moduleResolution": "Node",
    // 是否允许编译js文件
    "allowJs": false,
    // 严格模式
    "strict": false,
    // 未使用变量报错
    "noUnusedLocals": false,
    // 启动装饰器
    "experimentalDecorators": true,
    // 加载json
    "resolveJsonModule": true,
    // 允许export=导出,由import from 导入
    "esModuleInterop": true,
    // 允许默认导入
    "allowSyntheticDefaultImports": true,
    // 删除注释
    "removeComments": false,
    // 生成定义文件
    "declaration": true,
    // 生成定义sourceMap
    "declarationMap": false,
    // 定义文件输出目录
    "declarationDir": "./dist",
    // 导入库类型定义
    "lib": ["esnext", "dom"],
    // 导入指定类型包
    "types": []
  },
  // 排除目录
  "exclude": ["node_modules", "dist"],
  // 导入目录
  "include": [
    "src/*" 
  ]
}

配置babel

在根目录创建.babelrc,并添加以下内容

{
    "presets": [
        "@babel/preset-env",
        "@babel/preset-typescript"
    ],
    "plugins": [
        "@babel/plugin-external-helpers",
        [
            "@babel/plugin-transform-runtime",
            {
                "useESModules": true
            }
        ]
    ]
}

配置eslint

在根目录创建.eslintrc,并添加以下内容

{
    "extends": [
        "eslint:recommended",
        "plugin:@typescript-eslint/eslint-recommended",
        "plugin:@typescript-eslint/recommended",
        "prettier"
    ],
    "parser": "@typescript-eslint/parser",
    "plugins": [
        "@typescript-eslint"
    ],
    "rules": {
        "ban-types": "off"
    }
}

配置rollup

在根目录创建rolup.config.js,并添加以下内容

import nodeResolve from "@rollup/plugin-node-resolve";
import commonjs from "@rollup/plugin-commonjs";
import {babel} from "@rollup/plugin-babel";
import {terser} from "rollup-plugin-terser";
import dts from "rollup-plugin-dts";

import path from "path";
import pkg from "./package.json";

// 用于解析绝对路径
const resolvePath = (...args) => path.resolve(__dirname, ...args);

export default [
    // 生成 .d.ts 类型声明文件
    {
        input: resolvePath("src/index.ts"),
        output: {
            file: resolvePath("./", pkg.types),
            format: "es",
        },
        plugins: [dts()],
    },
    {
        input: resolvePath("./src/index.ts"),
        output: [
            // cjs 格式打包
            {file: resolvePath("./", pkg.main), format: "cjs"},
            // es 格式打包
            {file: resolvePath("./", pkg.module), format: "es"},
            // umd 格式打包
            {
                file: resolvePath("./", pkg.unpkg),
                format: "umd",
                name: "PangJuUtils",
                globals: {},
                plugins: []
            },
        ],
        plugins: [
            // 解析第三方模块
            nodeResolve({ modulesOnly: true, extensions: ['.js', '.ts']}),
            // 配置babel
            babel({
                exclude: "**/node_modules/**",
                babelHelpers: "runtime",
                extensions: ['.js', '.ts'],
            }),
            // commonjs模块转es6模块
            commonjs({extensions: ['.js', '.ts']}),
            // 代码压缩
            terser({
                compress: {
                    // 去除 console
                    drop_console: true,
                    pure_getters: true,
                    unsafe: true,
                    unsafe_comps: true,
                    warnings: false
                },
            }),
        ],
    },
];

配置jest

在根目录创建jest.config.js,并添加以下内容

export default {
  preset: "ts-jest",
  testEnvironment: "node",
  transform: {
    "^.+\.ts$": "ts-jest",
  },
  extensionsToTreatAsEsm: [".ts"],
  moduleFileExtensions: ["ts", "js"],
  moduleNameMapper: {
    "^src/(.*)": "<rootDir>/src/$1",
  },
  globals: {
    "ts-jest": {
      useESM: true,
      tsconfig: "tsconfig.test.json",
    },
  },
};

测试开发文件demo

import { describe, test, expect } from "@jest/globals";
import { StringUtils } from "src/util/StringUtils";

describe("StringUtils Test", () => {
  test("isEmpty Test", () => {
    expect(StringUtils.isEmpty("")).toBeTruthy();
  });
});

有不对的地方请在评论区指正,我会尽快修改