react组件化开发发布到npm

1.项目目录

  • build:webpack打包用(开发环境、发布环境)
  • example:开发环境的模板页
  • lib:打包好的文件夹(用于发布到npm上)
  • src:想要封装的公共组件
  • .babelrc:处理es6语法
  • package.json:打包的依赖文件,管理项目模块包

开发环境配置(webpack.dev.config.js)

const path = require(‘path‘)
const htmlWebpackPlugin = require(‘html-webpack-plugin‘)

module.exports = {
  entry: path.join(__dirname, ‘../example/main.js‘),
  devtool: ‘cheap-module-eval-source-map‘,
  output: {
    path: path.join(__dirname, ‘../dist‘),
    filename: ‘bundle.js‘
  },
  plugins: [ // 插件
    new htmlWebpackPlugin({
      template: path.join(__dirname, ‘../example/index.html‘),
      filename: ‘index.html‘
    })
  ],
  module: {
    rules: [
      { test: /\.css$/, use: [‘style-loader‘, ‘css-loader‘] }, // 如果想要启用 CSS 模块化,可以为 css-loader 添加 modules 参数即可
      { test: /\.scss$/, use: [‘style-loader‘, ‘css-loader‘, ‘sass-loader‘] },
      { test: /\.(jpg|png|gif|bmp|jpeg)$/, use: ‘url-loader?limit=5000‘ },
      { test: /\.(ttf|eot|svg|woff|woff2)$/, use: ‘url-loader?limit=5000‘ },
      { test: /\.jsx?$/, use: ‘babel-loader‘, exclude: /node_modules/ }
    ]
  }
}

打包环境配置(webpack.pub.config.js)

const path = require(‘path‘)
// 导入每次删除文件夹的插件
const cleanWebpackPlugin = require(‘clean-webpack-plugin‘)
const webpack = require(‘webpack‘)
// 导入抽取CSS的插件
const ExtractTextPlugin = require("extract-text-webpack-plugin")
// 导入压缩CSS的插件
const OptimizeCssAssetsPlugin = require(‘optimize-css-assets-webpack-plugin‘)

module.exports = {
  entry:  path.join(__dirname, ‘../src/index.js‘),
  devtool: ‘cheap-module-source-map‘,
  output: {
    path: path.join(__dirname, ‘../lib‘),
    filename: ‘index.js‘,
    libraryTarget: ‘umd‘,  //发布组件专用
    library: ‘ReactCmp‘,
  },
  plugins: [ // 插件
    new cleanWebpackPlugin([‘./lib‘]),
    new webpack.optimize.UglifyJsPlugin({
      compress: { // 配置压缩选项
        warnings: false // 移除警告
      }
    }),
    new ExtractTextPlugin("css/styles.css"), // 抽取CSS文件
    new OptimizeCssAssetsPlugin()// 压缩CSS的插件
  ],
  module: {
    rules: [
      {
        test: /\.css$/, use: ExtractTextPlugin.extract({
          fallback: "style-loader",
          use: "css-loader",
          publicPath: ‘../‘ // 指定抽取的时候,自动为我们的路径加上 ../ 前缀
        })
      },
      {
        test: /\.scss$/, use: ExtractTextPlugin.extract({
          fallback: ‘style-loader‘,
          use: [‘css-loader‘, ‘sass-loader‘],
          publicPath: ‘../‘ // 指定抽取的时候,自动为我们的路径加上 ../ 前缀
        })
      },
      { test: /\.(jpg|png|gif|bmp|jpeg)$/, use: ‘url-loader?limit=5000&name=images/[hash:8]-[name].[ext]‘ },
      { test: /\.(ttf|eot|svg|woff|woff2)$/, use: ‘url-loader?limit=5000&name=images/[hash:8]-[name].[ext]‘ },
      { test: /\.js$/, use: ‘babel-loader‘, exclude: /node_modules/ }
    ]
  }
}

package.json

{
  "name": "react-cmp",
  "version": "0.0.4",
  "description": "初始化开发react组件",
  "main": "lib/index.js",
  "files": [
    "build",
    "example",
    "src"
  ],
  "repository": {
    "type": "git",
    "url": "git+https://github.com/lydxwj/react-cmp.git"
  },
  "homepage": "https://github.com/lydxwj/react-cmp",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "dev": "webpack-dev-server --config ./build/webpack.dev.config.js --open --port 3000 --hot",
    "pub": "webpack --config ./build/webpack.pub.config.js",
    "prepublish": "npm run pub"
  },
  "keywords": [ "react", "component", "react-cmp" ],
  "author": "lyd",
  "license": "MIT",
  "dependencies": {
    "prop-types": "^15.6.0",
    "react": "^16.1.1",
    "react-dom": "^16.1.1"
  },
  "devDependencies": {
    "babel-core": "^6.26.0",
    "babel-loader": "^7.1.2",
    "babel-plugin-import": "^1.6.2",
    "babel-plugin-transform-runtime": "^6.23.0",
    "babel-preset-env": "^1.6.1",
    "babel-preset-react": "^6.24.1",
    "babel-preset-stage-0": "^6.24.1",
    "clean-webpack-plugin": "^0.1.17",
    "css-loader": "^0.28.7",
    "extract-text-webpack-plugin": "^3.0.2",
    "file-loader": "^1.1.5",
    "html-webpack-plugin": "^2.30.1",
    "node-sass": "^4.6.0",
    "optimize-css-assets-webpack-plugin": "^3.2.0",
    "sass-loader": "^6.0.6",
    "style-loader": "^0.19.0",
    "url-loader": "^0.6.2",
    "webpack": "^3.8.1",
    "webpack-dev-server": "^2.9.4"
  }
}

组件

// button.js 封装的button组件
import React, { Component } from ‘react‘;
import PropTypes from ‘prop-types‘;
export default class Button extends Component {
  constructor(props) {
    super(props)
  }
  static propTypes = {
    /**
     * @title 样式定义
     * @description 通过CSS定义按钮的样式
     */
    style: PropTypes.shape({
      color: PropTypes.string,
      fontSize: PropTypes.number,
      background: PropTypes.string,
      padding: PropTypes.string,
    }),
  };

  static defaultProps = {
    style: {
      color: ‘#fff‘,
      background: ‘green‘,
      padding: ‘4px‘,
    },
  };
  render() {
    const style = this.props.style;
    return (
      <button style={style}>{this.props.children}</button>
    );
  }
}

// index.js输出文件
import React from ‘react‘;
import RCmp from ‘./app‘;
import Button from ‘./button‘;
import Photo from ‘./photo‘;
import ‘./app.scss‘;
RCmp.Button = Button;
RCmp.Photo = Photo;
export default RCmp;
export {
  Button,
  Photo,
  RCmp,
}

实时调试

npm run dev

发布

npm run pub

将lib导入到node_modules

引入

iimport React from ‘react‘;
import PropTypes from ‘prop-types‘;
import {
  modal
} from ‘math_manage‘
import AutoSuggest from ‘react-tiny-autosuggest‘;
import MyApp,{Button,Photo,} from ‘react-cmp-master‘;

class App extends React.Component {
  static defaultProps = {}
  static propTypes = {}

  constructor(props) {
    super(props);
  }
  componentWillMount() {
    document.title = "1666";
    console.log(modal);
  }
  render() {
    const suggestions = [‘foo‘, ‘bar‘];
    const handleSelect = selection => {console.log(selection)};

    let input;
    const handleSubmit = () => console.log(input.value);
    return (
      <div>
        <AutoSuggest
          suggestions = {suggestions}
          onSelect = {handleSelect}
          placeholder = "whatever..."
        />
        <MyApp text=‘Hello react组件‘/>
        <Button/>
        <Photo src={‘https://ss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=2198746125,2255961738&fm=27&gp=0.jpg‘}/>
      </div>
    )
  }
}

export default App;

原文地址:https://www.cnblogs.com/Hsong/p/9938928.html

时间: 2024-08-04 03:55:14

react组件化开发发布到npm的相关文章

iOS组件化开发-发布私有库

创建远程索引库 将远程索引库添关联到本地 pod repo 查看本地已关联仓库源 pod repo add 本地索引库名称 远程索引库仓库地址 pod repo update 索引库名称 pod repo remove 本地索引库名称 执行命令 添加远程索引库`KTPodSpecs`克隆到本地 原文地址:https://www.cnblogs.com/CoderHong/p/11217312.html

Vue组件化开发

一. 通过axios实现数据请求 1. json简介 json是 JavaScript Object Notation 的首字母缩写,单词的意思是javascript对象表示法,这里说的json指的是类似于javascript对象的一种数据格式. json的作用:在不同的系统平台,或不同编程语言之间传递数据. 1.1 json数据的语法 json数据对象类似于JavaScript中的对象,但是它的键对应的值里面是没有函数方法的,值可以是普通变量,不支持undefined,值还可以是数组或者jso

Webpack+Vue+ES6 前端组件化开发mobile-multi-page应用实战总结

本文版权归博客园和作者吴双本人共同所有 转载和爬虫请注明原文地址 www.cnblogs.com/tdws 一.写在前面 项目上线有一段时间了,一个基于webpack+vue+ES6的手机端多页面应用.其实说是多页面应用,实际上在webpack中属于四个app,  如果真是做纯单页面,那应该有二三十个页面吧.所以我这里的多页面应用,是分为四个SPA.比如微信最下面,有四个导航,微信,通讯录,发现,我. 那么这四个导航,就是我的四个SPA,配置多个入口即可. 在这里就不说太多代码了,项目结构将会放

Android适合组件化开发的路由框架:Launch

1.概述 最近越来越不想写代码了,特别是一些重复性的代码,比如由于每次启动一个 Activity,我们都会很习惯的在 Activity 中写下: public static void launch(Activity activity) { Intent intent = new Intent(); intent.setClass(activity, xxxActivity.class); activity.startActivity(); } 已经有两年Android开发经验的我掐指一算,好像有

vue中的组件化开发

常常听一些前辈说vue是react的组件化+angular的数据绑定的结合体: 最近刚刚开始使用vue开发项目,我也是在摸索中前进,现在我们来说一说vue的组件化开发. 实际的项目开发,并不像一些文章中的提到的模式,而是如图所示的模式: App.vue是项目的入口.组件实则也是一个以.vue为后缀的文件.我们可以在src\components文件夹下创建一个xxx.vue: 然后在文件中编写可以提出的公共部分的代码为组件.然后在您需要调用该组件的页面,如下图方式调用: 是不是很简单.现在来解释一

Android 业务组件化开发实践

组件化并不是新话题,其实很早很早以前我们开始为项目解耦的时候就讨论过的.但那时候我们说的是功能组件化.比如很多公司都常见的,网络请求模块.登录注册模块单独拿出来,交给一个团队开发,而在用的时候只需要接入对应模块的功能就可以了. 百牛信息技术bainiu.ltd整理发布于博客园 今天我们来讨论一下业务组件化,拿出手机,打开淘宝或者大众点评来看看,里面的美食电影酒店外卖就是一个一个的业务.如果我们在一个项目里面去写的时候,总会出现或多或少的代码耦合,最典型的有时为了赶上线时间而先复制粘贴一段类似的代

Android组件化开发实践

Android项目中代码量达到一定程度,编译将是一件非常痛苦的事情,短则一两分钟,长则达到五六分钟.Android studio推出instant run由于各种缺陷一般情况下是被关闭的--组件化开发可以有效降低代码模块的耦合度,使代码架构更加清晰,同时模块化的编译可以有效减少编译时间,当然总的编译时间是不会减少的,只是App模块化之后开发某个模块时,只需要编译特定模块,可以快速编译调试. 百牛信息技术bainiu.ltd整理发布于博客园 原理 组件化和插件化有些同学有些迷惑,简单来说组件化是在

组件化开发--搭建

前段工程化:      在前段开发的过程中,一些重复的工作由程序自动完成.在项目开发的过程中,css使用预处理器,js使用es6或者typescript或者coffeescript来开发      html使用模板语言开发,都需要进行编译,在项目开发的时候,按照模块化的思路进行拆分,但在上线的时候,为了提高运行的效率/性能,减少http请求,      需要对这些模块进行拼接,压缩等操作,测试.这些工作需要由工程化工具来完成,比如gulp的插件前段组件化:      css组件化开发     

vuex在组件化开发中的简单应用小例子

首先, 介绍一下vuex是个什么东西, 个人理解来说, vuex就是一个状态管理的东西, 它里面有且仅有一个Store仓库, 这个仓库里面存放着一些变量, 为什么要有这么一个变量呢, 用过vue的人肯定都清除, 父子组件之间的通讯传值是个比较麻烦的事情, 特别是, 嵌套组件特别多的时候, 这种情况下, 一级一级地传递下去十分麻烦, 还有就是兄弟组件之间的传值也一样麻烦. 而vuex中的Store这个仓库, 就能够为我们将放在这个仓库中的值, 分发给整个项目下的所有组件, 也就是说是, 不用一级一