美文网首页
rollpkg+react+ts封装npm包

rollpkg+react+ts封装npm包

作者: 小灰灰_a | 来源:发表于2022-05-10 17:05 被阅读0次

    在我们实际的开发工作中,对于多次使用的组件或内容,会抽离作为组件,以便在不同模块使用,这样大大提高了代码的复用性。
    那如果我们在不同项目中使用共公组件,就需要把组件封装成 npm 包,在不同项目中直接进行 npm install xxx 就可以实现复用。

    那我们看一下,如何封装一个 npm 包

    1、初始化 react+Ts项目

    npx create-react-app [文件名] --template typescript
    

    2、删除多余内容,只留下 src node_modules tsconfig.json package.json 即可

    3、清空 src 中的文件,新建 index.ts [入口文件] 和 components [模板文件夹]
    index.ts入口文件

    // index.ts 入口文件 注意这里是 export 不是 import
    export * from './components/Text'
    

    components 文件夹下 新建 index.tsText.tsx 模版

    // components/index.ts 文件
    export * from './Text'
        
    // components/Text.tsx 文件
    import React, { FC } from 'react'
    type TextProps = {
      name: string
    }
    export const Text: FC<TextProps> = (props) => {
      return <div>{props.name}</div>
    }
    // 重要: 模板使用的 标签名 <Text name={'xhh'} />
    Text.displayName = 'Text'
    
    image.png

    好了,到目前位置,我们的模板就已经新建完成,下面就是需要打包及发布

    4、修改 package.json

    {
        ...
        "author": "xiaohuihui",
        "license": "ISC",
        "main": "dist/npm_test.cjs.js",
        "module": "dist/npm_test.esm.js",
        "types": "dist/index.d.ts",
        "sideEffects": false,
        "files": [
              "dist",
              "typings"
         ],
            "scripts": {
              "prepare": "install-peers",
              "build": "rollpkg build",
              "watch": "rollpkg watch",
              "prepublishOnly": "npm run build"
            },
                ...
    }
    

    "dependencies": {...} 修改为"peerDependencies": {...}peerDependencies的目的是提示宿主环境去安装满足插件peerDependencies所指定依赖的包,然后在插件import或者require所依赖的包的时候,永远都是引用宿主环境统一安装的npm包,最终解决插件与所依赖包不一致的问题。

    其他依赖 放在devDependencies 中,需要安装 npm i rollpkg install-peers-cli -D

    package.json 完整配置:

    {
      "name": "npm_test",
      "version": "0.1.0",
      "private": false,
      "author": "xhh",
      "license": "ISC",
      "main": "dist/npm_test.cjs.js",
      "module": "dist/npm_test.esm.js",
      "types": "dist/index.d.ts",
      "sideEffects": false,
      "files": [
        "dist",
        "typings"
      ],
      "peerDependencies": {
        "react": "^18.1.0",
        "react-dom": "^18.1.0",
        "react-scripts": "5.0.1"
      },
      "scripts": {
        "prepare": "install-peers",
        "build": "rollpkg build",
        "watch": "rollpkg watch",
        "prepublishOnly": "npm run build"
      },
      "devDependencies": {
        "@testing-library/jest-dom": "^5.16.4",
        "@testing-library/react": "^13.2.0",
        "@testing-library/user-event": "^13.5.0",
        "@types/jest": "^27.5.0",
        "@types/node": "^16.11.34",
        "@types/react": "^18.0.9",
        "rollpkg": "^0.5.7",
        "typescript": "^4.6.4",
        "install-peers-cli": "^2.2.0",
        "web-vitals": "^2.1.4",
        "@types/react-dom": "^18.0.3"
      },
      "publishConfig": {
        "registry": "xxxx"
      }
    }
    
    

    5、在 tsconfig.json 中添加 "extends": "rollpkg/configs/tsconfig.json",

    // tsconfig.json
    {
      "extends": "rollpkg/configs/tsconfig.json",
      "compilerOptions": {
        "target": "es5",
        "lib": [
          "dom",
          "dom.iterable",
          "esnext"
        ],
        "sourceMap": true,
        "allowJs": true,
        "skipLibCheck": true,
        "esModuleInterop": true,
        "allowSyntheticDefaultImports": true,
        "experimentalDecorators": true,
        "strict": true,
        "strictNullChecks": true,
        "strictFunctionTypes": true,
        "forceConsistentCasingInFileNames": true,
        "module": "esnext",
        "downlevelIteration": true,
        "moduleResolution": "node",
        "resolveJsonModule": true,
        "isolatedModules": true,
        "noEmit": true,
        "removeComments": true,
        "noUnusedLocals": false,
        "noUnusedParameters": false,
        "noImplicitAny": true,
        "noImplicitReturns": true,
        "noImplicitThis": true,
        "jsx": "react-jsx",
        "noFallthroughCasesInSwitch": true
      }
    }
    
    

    6、添加eslint 相关内容
    .eslintrc.json

    {
      "extends": ["./node_modules/rollpkg/configs/eslint"],
      "rules": {
        "quotes": [
          "warn",
          "single"
        ],
        "semi": ["warn", "never"],
        "no-console": "warn",
        "no-debugger": "warn",
        "no-alert": "warn",
        "camelcase": "warn",
        "@typescript-eslint/no-empty-interface": "warn",
        "@typescript-eslint/no-empty-function": "warn",
        "@typescript-eslint/no-unused-vars": "warn",
        "jsx-a11y/click-events-have-key-events": "off",
        "jsx-a11y/no-noninteractive-element-interactions": "off"
      }
    }
    

    .eslintrc.commit.json

    {
      "extends": "./.eslintrc.json",
      "rules": {
        "no-console": "error",
        "no-debugger": "error",
        "no-alert": "error",
        "camelcase": "error",
        "@typescript-eslint/no-empty-interface": "error",
        "@typescript-eslint/no-empty-function": "error",
        "@typescript-eslint/no-unused-vars": "error"
      }
    }
    

    好了,现在配置也改好了,直接执行 npm run build 打包,然后执行 npm publish 发布即可

    相关文章

      网友评论

          本文标题:rollpkg+react+ts封装npm包

          本文链接:https://www.haomeiwen.com/subject/sjzdurtx.html