在开始开发之前,我们需要创建一个空的项目文件夹。安装并初始化npminit-y2。安装webpack相关依赖npminstallwebpackwebpack-cli-D3。安装babel-loader相关依赖npminstallbabel-loader@babel/core@babel/preset-env-D4。安装jsx支持依赖npminstall@babel/plugin-transform-react-jsx-D配置1.在根目录下创建一个main.js文件。这个文件是入口文件。2.创建webpack.config.jsmodule.exports={entry:{main:'./main.js'},module:{rules:[{test:/\.js$/,use:{loader:'babel-loader',options:{presets:['@babel/preset-env'],plugins:[['@babel/plugin-transform-react-jsx',{pragma:'createElement'}]]//自定义pragma参数,我也可以设置成我的名字:maomin}}}]},mode:'development',optimization:{minimize:false3.创建一个reactJsx.js文件这个文件是主要的逻辑文件。开发reactJsx.js//封装并创建Dom节点(component){this.root.appendChild(component.root);}}//封装并插入文本节点classTextWrapper{constructor(content){this.root=document.createTextNode(content);}}//组件exportclassComponent{constructor(){this.props=Object.create(null);//创建一个原型为null的空对象this.children=[];this._root=null;}setAttribute(name,value){this.props[name]=value;}appendChild(component){this.children.push(component);}getroot(){//valueif(!this._root){this._root=this.render().root;}returnthis._root;}}//创建节点,createElement比较webapck.config.js中的pragma参数。exportfunctioncreateElement(type,attributes,...children){lete;if(typeoftype==="string"){e=newElementWrapper(type);}else{e=newtype();}for(letpinattributes){//循环属性e.setAttribute(p,attributes[p]);}letinsertChildren=(children)=>{for(letchildofchildren){if(typeofchild==="string"){child=newTextWrapper(child);}if(typeofchild==="object"&&childinstanceofArray){insertChildren(child);//递归}else{e.appendChild(child);}}};insertChildren(children);returne;}//添加到Dom中exportfunctionrender(component,parentElement){parentElement.appendChild(component.root);}main.jsimport{createElement,Component,render}from'./reactJsx.js'classMyComponentextendsComponent{render(){returnmaominimport{createElement,Component,render}from'./reactJsx.js'classMyComponentextendsComponent{render(){return
