听说你还不会搭建自己的组件库?快进来吧你

255 阅读4分钟

一、为什么要写这篇文章?

我相信有很多小伙伴像我一样喜欢组件库,想要拥有一个属于自己的组件库。但是落到实处的时候就会不由自主的退缩或者干脆就放挺,比如 tmd这手写代码咋这么不顺,我cao,它牵扯到的东西好像有点多,脑瓜子嗡嗡的,哎,过几天再想吧等等等等。结果一等就是一年,一等就是毕业,一等就是人到中年。所以我写下这篇保姆级文章,专门帮助上述童鞋光速入门组件库的建设开发。

二、你将获得什么?

在这篇文章里,我将会从0带你搭建一个最糙的小型组件库。啥叫最糙?只要这个组件库能够实现最基本的功能(引入、使用)就行,除此以外的任何你能想到的idea我都不管,哈哈哈。

三、造骨架

3.1、项目初始化

  // 1、mkdir Lui     --  创建项目目录(你的ui库想叫啥就起啥名字)
  // 2、npm init -y   --  项目初始化
  // 3、创建相应文件,项目目录大致如下:
  /**
       |---Lui
         |--src
           |-index.js
         |--example
           |-index.html
         |--dist(目录)
         |--.babelrc
         |--webpack.common.js
         |--webpack.dev.js
         |--webpack.prod.js
         |--package.json
         |--package.lock.js
         |--readme.md
  */

3.2、编写package.json

 {
     "name": "Lui",            // 项目的名称
     "version": "0.1.0",       // 项目的版本号
     "description": "",        // 描述一下你的项目,在文章里我就不写了
     "keywords": [],           // 描述一下项目的特点,增加曝光率
     "main": "./dist/index.js" // 当你将这个包build bundle并且发布后,再次import的时候,引入的其实是bundle目录下的dist目录下的index文件
     "private": false,         // 是否公开(否则npm会收费)
     "dependencies": {},       // 生产依赖
     “script": {               
         "test": "echo \"Error: no test specified\" && exit 1",
     },                        // 运行项目的命令
     "author": "<your name>"// 你的艺名
     "license": "ISC",         // 开源许可证
     "devDependencies": {},    // 开发依赖
 }

3.3、安装相应依赖

生产环境

npm install react react-dom --save

开发环境

npm install webpack webpack-cli @babel/core @babel/preset-env @babel/preset-react babel-loader css-loader html-webpack-plugin style-loader webpack-dev-server webpack-merge --save-dev

项目依赖图如下

项目依赖图1.png

3.4、webpack配置讲解

在这里我们区分了开发环境和生产环境,又将开发环境与生产环境的公共部分提取出来,所以配置文件有3个 common文件配置如下

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
    entry: './src/index.js',                                 
    output: {
        path: path.resolve(__dirname, 'dist'),
        filename: 'index.js',
        libraryTarget: 'umd',
        clean: true
    },
    module: {
        rules: [
            {
                test: /\.css$/,
                use: ['style-loader', 'css-loader']
            },
            {
                test: /\.(js|jsx)$/,
                exclude: /node_modules/,
                use: {
                    loader: "babel-loader"
                }
            }
        ]
    },
    resolve: {
        extensions: ['.jsx', '.js']
    },
    plugins: [
        new HtmlWebpackPlugin({
            title: 'Lui',
            template: './example/index.html',
            filename: './index.html',
            inject: true
        })
    ],
    devServer: {
        port: 3001,
        contentBase: './dist'
    }
};

dev文件配置如下

const WebpackMerge = require('webpack-merge');
const common = require('./webpack.common.js');

module.exports = WebpackMerge.merge(common, {
    mode: "development",
    devtool: "inline-source-map",
    watch: true
});

prod文件配置如下

const WebpackMerge = require('webpack-merge');
const common = require('./webpack.prod.js');

module.exports = {
     mode: "production",
     externals: ["react", "react-dom"]
};

3.5、更改package.json字段

{
    "scripts": {
        "start": "webpack serve --open --config=./webpack.dev.js --progress",
        "build": "webpack --config=./webpack.prod.js"
    }
}

3.6、编写.babelrc

 {
     "presets": ["@babel/preset-env", "@babel/preset-react"]
 }

3.7、example/html文件内容

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>一款样式齐全、配置简单、快速上手的基于react的UI组件库</title>
    </head>
    <body>
        <div id="root"></div>
        <script src='./index.js'></script>
    </body>
</html>

四、编写组件

我们造2个组件试一试,src目录下的结构如下:

src2.png

组件怎么编写真的不想写了,这个东西做出来有点成就感,但是写出来就有点乏力了(而且文章字数到这也有点多)。大家可以简单的写个export default 2个hello和 world组件。src下的index.js文件里别忘了 export {...}。

五、发布npm包

如何发布这个问题大家自行百度,现在来说一下在发布包的过程中你要注意的点以及可能会碰到的问题:

5.1、需要注意的点

  • 在执行npm publish 之前一定要将npm源切回到国外(registry.npmjs.org)
  • 千万不要手动更改package.json里的version字段,一定要通过命令的方式更改(npm version <major(含义: +1.x.x) | minor(x.+1.x) | patch(x.x.+1)>)

5.2、可能会碰到的问题

包名重复

这个需要大家更改一下自己的package.json文件里的name的值,一般为: @ /

私有收费

执行一下命令:

 npm publish --access public

scope not found

执行一下命令:

npm publish --scope=@<npm login name> -y

六、结语

恭喜你获得了第一个组件库,你可以将你的包下载到另一个项目里测试一哈。文章到此也接近尾声,如果这篇文章有帮助到你,那么在你的组件库的路上别忘了点个赞。如果有大佬路过,跪求你的指点为萌新照亮前方的路,那就这样886~