最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 听说你还不会搭建自己的组件库?快进来吧你

    正文概述 掘金(小九九的爸爸)   2021-08-07   573

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

    我相信有很多小伙伴像我一样喜欢组件库,想要拥有一个属于自己的组件库。但是落到实处的时候就会不由自主的退缩或者干脆就放挺,比如 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
    

    项目依赖图如下

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

    3.4、webpack配置讲解

    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目录下的结构如下:

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

    组件怎么编写真的不想写了,这个东西做出来有点成就感,但是写出来就有点乏力了(而且文章字数到这也有点多)。大家可以简单的写个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~


    起源地下载网 » 听说你还不会搭建自己的组件库?快进来吧你

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元