#ReactApp项目构建流程【1】

小白的ReactApp项目构建流程【环境搭建与HelloWorld】

  • 开发环境:win10
  • 开发软件:webstorm

创建新项目(空文件夹)

  • 当前目录下(以后以home表示)执行cmd

        webstorm上直接alt+F12即可弹出控制台
    
  • $npm init

        项目初始化,文件夹下新增package.json文件
    
    
  • $npm i webpack

    安装webpack
           
    
  • $npm i react

    安装react
    
    
  • $npm i react-dom -S

    其中 
    -S就是--save的简写,就行npm默认一个start的字段,你可以不必输入npm run start 而只需输入npm start,这两个效果是一样的。
    -D就是--save-dev 这样安装的包的名称及版本号就会存在package.json的devDependencies这个里面,
    而--save会将包的名称及版本号放在dependencies里面。
            
    
  • home下,新建build文件夹,同时内建webpack.config.js

    放置配置文件,webpack的config文件,以及一些脚本文件
    
            
    
  • home下,新建client文件夹,同时内建app.js以及App.jsx

    放置客户端文件,app.js作为应用入口,App.jsx用于声明整个应用页面上的内容   
    
    
  • 修改webpack.config.js以及package.json,给app.js添加测试代码

    [package.json]  
    ->start
    {
      "name": "react-learn",
      "version": "1.0.0",
      "description": "",
      "main": "index.js",
      "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1",
            "build":"webpack --config build/webpack.config.js"  
            //scripts-build:
             指定webpack的config文件,实际执行时需要删除此代码,否则会报错
             package.json mustbe actual JSON, not just JavaScript.因为json不识别注释
      },
      "author": "zc",
      "license": "ISC",
      "dependencies": {
        "react": "^16.2.0",
        "webpack": "^3.10.0"
      }
    }
    ->End
    
    
    [webpack.config.json] 
    ->start
    const path = require('path');
    module.exports = {
        entry: {                                     //资源文件的路径,打包时的入口
            app: path.join(__dirname,'../client/app.js')
        },
        output: {                                    //输出的目录
            filename: "[name].[hash].js",            //[]代表变量,hash用于刷新缓存
            path: path.join(__dirname,'../dist'),    //输出文件存放的路径
            publicPath: '/public'                    //静态资源文件引用的路径的前缀              --/public/app.hash.js,用于区分静态资源/API请求,还可以直接修改为cdn路径
        }
    }
    -> End
    
    [app.js]
    ->start
    alert(123);
    ->end
    
    
    
  • $npm run build

    打包完成,文件结构内出现dist目录并且生成项目文件
    
    
  • 编写App.jsx

    import  React from 'react'
      
    export default class App extends React.Component{
        render(){
            return(
                <div>Hello World </div>
            )
        }
    }
    //tips:
    1:如果未出现智能提示,
    Settings->Languages&Frameworks->Node.js and NPM->Coding Assistance->Enable 即可
    2:jsx内快速书写html标签:tab键
    
    
  • $npm i react-dom -S

    用于将react组件渲染到dom中
    
    
    
  • 修改app.js,用于将react组件渲染到dom中

    import ReactDOM from 'react-dom'
    import App from './App.jsx'
    ReactDOM.render(App,document.body)  
        //将App挂载在document.body中,因为此时并没有模板,只有body可以使用,官方推荐在body中创建一个默认 节点作为主dom
    
    
  • 修改webpack.config.js

    与output同级添加webpack解析模块
    
    module: {                           //添加模块,让webpack识别jsx代码(非标准js语法)
        rules: [
            {
                test:/.jsx$/,           //正则表达式,react项目设置为所有的符合test正则的文件
                loader: 'babel-loader'  //识别符合test正则的文件的loader,babel是编译各种最新js语法的工具,react指定工具
            }
        ]
    }
    
    
  • $npm i babel-loader -D

    开发的工具使用 -D加载提供给开发者的develope版本模块
    
    
  • $npm i babel-core-D

     babel-loader只是webpack的插件,其核心还是babel-core,需要安装
     
    
  • $npm run build

     此时运行会报错误,因为babel默认直接编译es6语法而不能支持jsx,需要配置babel编译模式->
     
    
  • root目录下新建.babelrc文件并编辑

    {
     "presets": [  //代表babel支持的语法,因为语法太多,所以babel-core中并未包含es2015
             ["es2015",{"loose":true}],//松散类型,非严格类型
             "react"                   //babel只编译有react选项的代码
         ]
     }
     
    
  • $npm i babel-preset-es2015 babel-preset-es2015-loose babel-preset-react -D

  • 删除老dist目录后 ->npm run build

    新生成的dist目录中的[name].[hash].js文件会非常大,因为react源码会被编译其中,
    其中最底下的代码就是开发者自己编写的代码
    
    
  • $npm i html-webpack-plugin -D

    想要在浏览器中打开自己编译好的软件,需要安装此插件
    
    本人安装成了 webpack-html-plugin 233
    
    
  • 引用html-webpack-plugin【最简单的引用方式】

    在webpack.config.js顶部添加代码
    
    const HTMLPlugin=require('html-webpack-plugin')
    
    同时添加与module同级的选项
    
    plugins:[
        new HTMLPlugin();//webpack编译时生成HTML页面,并且把所有的entry选项都注入到HTML页面中,
                            并且filename,path和publicPath都是基于output选项进行拼接而成
    ]
    
    
  • $npm run build

    可以看到在dist目录中出现webpack编译成的HTML页面
    
    因为此时并未起服务器/路径映射,因此此时路径将会出现问题,无法访问资源文件
    
    删除dist目录,将webpack.config.js->output->publicPath置为空,使webpack使用绝对路径编译文件
    
    重新 build,用HTML进入编译好的HTML文件
    
    会发现仍然没有内容,F12发现报错
       --报错1:不能直接将react组件挂载在document.body上,但这并不是影响运行的错误
       --报错2:ReactDOM.render时,也需要用jsx语法编写
    
        其实,jsx文件使用的js语法是es6的语法,而在app.js中含有jsx代码,也就是说app.js代码中实际使用的是
    ES6+jsx代码,之前只是对jsx用babel编译成ES2015代码,而ES6文件并未做此处理,因此需要webpack.config.
    js->rules修改test,用于将ES6语法编译成ES2015,将现有的test /.jsx$/ -> /.(jsx|js)$/后,再执行
    [npm run build],此时会报错,原因是在[root -> node_modules]下的文件在npm init加载时已经经过编译,
    所以此文件夹下的js代码需要过滤,那么在rules中新添加test用于[过滤非node_modules]文件夹下的js文件
    
    
    
  • 修改webpack.config.js->npm run build

     {
           test:/.js$/,
           loader: 'babel-loader',
           exclude:[
                path.join(__dirname,'../node_modules')
              ]
      }
      
    
  • 打开HTML,报错,显示React未定义

    贴上错误代码
    _reactDom2.default.render(React.createElement(_App2.default, null), document.body);
    
    在app.js中,引入了jsx标签,必须要引入React,因为jsx代码最终翻译出来的标签都会用到React
    
    
  • app.js中引入React

    import React require('react')
    
    
  • $npm run build

    进入HTML,OJBK,顺利显示Hello World
    
    

小结:

后续再写

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容