likes
comments
collection
share

从0到1搭建基于@tarojs/components组件库

作者站长头像
站长
· 阅读数 51

前言

最近项目任务没有很重,都是自己在学习东西,为接下来的项目做技术准备(RNNestJS),中间还夹杂着些bug或小功能要改。在改动的过程中就发现了一个问题,使用组件时,这个组件我并不知道有什么具体功能不知道长什么样子,我能不能直接用?不像element-ui开打官网,想用什么就找什么。可能之前大家都是忙于业务的开发,也没有想到这个。

这只是一部分,下面还有很多很多

从0到1搭建基于@tarojs/components组件库

于是我就开始搭建组件库了,让开发有一个好的体验,顺便也提升一下自己。后面有demo仓库。

技术选型: Taro``+@tarojs/components+React+webpack(打包组件库)+jest(单元测试)+storybook(Ul开发、测试和文档编写)

正文

根据提示创建项目

taro init

接下来就是漫长的配置过程

jest配置

在创建完项目时,就自带了jest可以进行单元测试。但是这时候运行 pnpm run test会报错。解决方法看这个,将taro版本退回到3.6.22,就可以解决。

Taro3.6.24模板项目创建后运行测试报错 · Issue #38 · NervJS/taro-test-utils (github.com)

当我们编写完 button组件并进行测试,还是报错。这是因为Jest默认是不知道如何处理样式文件(如CSSSCSS)的,因为它主要是用来测试JavaScript代码。

从0到1搭建基于@tarojs/components组件库

安装

pnpm add identity-obj-proxy 

修改jest.config.ts文件,修改完再次运行就可以了。

const defineJestConfig = require('@tarojs/test-utils-react/dist/jest.js').default

module.exports = defineJestConfig({
  //其他配置
  moduleNameMapper: {
    '\\.(css|less|scss|sass)$': 'identity-obj-proxy'
  },
})

运行pnpm run test,可以看到运行成功。

从0到1搭建基于@tarojs/components组件库

从0到1搭建基于@tarojs/components组件库

剩下就是对测试工具的使用了,可以看下面两个文档。

NervJS/taro-test-utils: 多端单测工具 (github.com)

快速开始 · Jest (jestjs.io)

配置storybook

安装storybook

npx sb init

taro如何配置storybook可以查看这个, 第三方工具 | Taro 文档 (jd.com)

因为我在项目中使用了scss,所以还需要在.storybook/main.tswebpackFinal中配置解析 scss

webpackFinal: (config: any) => ({
   //其他
    module: {
      rules: [
        ...config.module.rules,
        {
          test: /\.scss$/,
          use: ['style-loader', 'css-loader', 'sass-loader'],
        }
      ],
    },
 
  }),

运行 pnpm run storybook,可以在网页中看到了

从0到1搭建基于@tarojs/components组件库

具体的storybook配置可以查看Storybook: Frontend workshop for UI development,我也还没了解。

配置webpack打包组件

安装webpack及其插件,这里只做了最简单的处理。还有什么需求和优化可以自己配置。

const path = require("path")
const MiniCssExtractPlugin = require('mini-css-extract-plugin');

/** @type {import('webpack'.Configuration)} */
module.exports = {
  entry: './src/index.ts',
  output: {
    filename: 'index.js',
    path: path.resolve(__dirname, 'componentsDist'),
    clean: true,
    library: {
      type: 'umd',
    },
  },
  resolve: {
    extensions: ['.ts', '.tsx', '.js', '.jsx', '.json'],
  },
  mode: "production",

  module: {
    rules: [
      {
        test: /\.tsx?$/,
        use: {
          loader: "ts-loader",
          //不做ts检查只是转译
          options: {
            transpileOnly: true
          }
        },
        exclude: [
          path.resolve(__dirname, 'node_modules'),
          path.resolve(__dirname, 'src/pages')
        ],
      },
      {
        test: /\.s[ac]ss$/i,
        use: [
          // 提取CSS到单独的文件
          MiniCssExtractPlugin.loader,
          // 将 CSS 转化成 CommonJS 模块
          'css-loader',
          // 将 Sass 编译成 CSS
          'sass-loader',
        ],
      },
    ]
  },

  plugins: [
    // 生成css文件
    new MiniCssExtractPlugin({
      filename: '[name].css',
      chunkFilename: '[id].css',
    }),
  ],

  externals: {
    react: 'react',
    'react-dom': 'react-dom',
    '@tarojs/components': '@tarojs/components',
    '@tarojs/runtime': '@tarojs/runtime',
    '@tarojs/taro': '@tarojs/taro',
    '@tarojs/react': '@tarojs/react',
  },
}

并在scripts中配置打包命令, "build:compile": "webpack",执行命令后会生成这样的一个文件夹。为什么不叫dist文件呢,因为taro启动项目的时候已经生成一个dist文件夹了。

从0到1搭建基于@tarojs/components组件库

我们直接使用打包后的文件

从0到1搭建基于@tarojs/components组件库

启动项目,ok

从0到1搭建基于@tarojs/components组件库

然后自行上一下npm,就可以当一个包使用了,这里就不讲了。

定制主题

这里是使用css变量来实现。在src/style/var.scss中编写css变量

从0到1搭建基于@tarojs/components组件库

从0到1搭建基于@tarojs/components组件库

用户如何自定义呢?只需要覆盖css变量就可以了。在app.ts中先后引入组件库样式文件app.scss

从0到1搭建基于@tarojs/components组件库

app.scss中进行css变量覆盖 从0到1搭建基于@tarojs/components组件库

再来看一下效果,ok的。

从0到1搭建基于@tarojs/components组件库

结语

感兴趣的可以去试试。

仓库地址 :taro-component-ui: 对@tarojs/components进行封装 (gitee.com)

转载自:https://juejin.cn/post/7353106546827542543
评论
请登录