zoukankan      html  css  js  c++  java
  • 学习建立基于react,webpack模板项目

    我是一个react的初学者,在学习的过程中遇到了模板搭建问题,想把自己遇到的问题记录下来,顺便加深印象,有不对的地方请指正。

    学习的过程中,我主要感谢两个人的博客:

    1. http://www.wukai.me/2016/09/14/create-a-react-webpack-es6-project/
    2. http://www.jianshu.com/p/42e11515c10f

    这两个人的博客写的都非常好,感兴趣的同学可以去看看。

    由于我之前没有接触过webpack,所以先学习了一下博客2,然后在按照博客1进行的实现。

    什么是webpack?


    通俗说是一个模块打包机。它分析项目结构,找到JavaScript模块以及一些不能直接运行的拓展语言,然后将其打包合适的格式以供浏览器使用。它的工作方式是:把项目当做一个整体,通过一个给定的文件,从改文件开始找到项目的所有依赖文件,使用loaders处理他们,最后打包为一个浏览器可识别的js文件。

    项目结构

    -src

      -index.js

      -App.js

    -.babelrc

    -index.html

    -package.json

    -server.js

    -webpack.config.js

    项目步骤

    环境搭建

    需要安装node.js,因为后续要用到npm

    初始化项目

    首先创建一个空的文件夹,名字自己拟定。在该文件中,同时按shift和鼠标右键进入当前的命令行,输入:

    npm init //按照提示输入项目的基本信息
    //或者是输入
    npm init -y //按照默认方式设置基本信息
    //作用是:初始化一个项目,此时多出来一个package.json文件

    package.json 文件的作用是:

    • 相当于你本地项目的一个文档说明
    • 允许你制定你项目中所使用的node包版本
    • 偏于给其他人共享

    将部分package.json的内容列举如下:

    {
      "name": "react-webpack-babel",//名称项目,全部小写,不能有空格
      "version": "1.0.0", // 项目版本号,最好遵守GNU版本号管理
      "description": "",
      "main": "index.js",//目录中启动文件名称(入口文件),一般都是index.js
      "scripts": {
        "test": "echo "Error: no test specified" && exit 1"//一般默认为一个test空文件夹,用作写测试代码
      },
      "keywords": [],//项目的关键词
      "author": "",
      "license": "ISC",
      "devDependencies": { // 开发或者测试时,依赖的包
        "babel-core": "^6.24.1",
        "babel-loader": "^7.0.0",
        "babel-preset-es2015": "^6.24.1",
        "babel-preset-stage-0": "^6.24.1",
        "react-hot-loader": "^1.3.1",
        "webpack": "^3.0.0-rc.1",
        "webpack-dev-server": "^2.4.5"
      },
      "dependencies": { //正式使用时,依赖的包
        "react": "^15.5.4",
        "react-dom": "^15.5.4"
      }
    }

     webpack 安装

    npm install webpack --save-dev  //作用:给项目安装webpack 

    此时会发现多出来一个 node_modules 文件夹,这里存放着项目所依赖的npm包的地方

    --save-dev :表示将会把webpack的名称写入package.json,并且会写入到“devDenpendencies”项中

    --save:表示会写入的是“dependencies”项

    webpack 测试

    在项目文件夹下新建index.js文件,里面写入:

    console.log("this is a javascript file for test");
    

      如果webpack是非全局安装,则:

    node_modules/.bin/webpack  index.js  bundle.js //
    将index.js文件打包成为bundle.js的文件。后一个参数是你想生成的文件名称

      如果想webpack全局安装,则:

    npm install webpack -g //全局安装
    

      全局安装后,运行的命令如下:

    webpack index.js bundle.js //意思是:将index.js文件打包成为bundle.js的文件,后一个参数是你想生成的文件名称
    

      运行后会发现多了一个bundle.js文件

    node bundle.js
    
    this is a javascript file for test.//输出结果
    

      新建一个html文件,引入bundle.js

    // index.html
    <!DOCTYPE html>
    <html>
      <head>
        <title>react webpack boilerplate</title>
      </head>
      <body>
        <script src="./bundle.js"></script>
      </body>
    </html>
    

      打开 index.html ,可以在浏览器的控制台看到输出结果

    webpack 的配置文件

    新建 webpack.config.js文件,输入如下:

    var path = require('path');
    var webpack = require('webpack');
    
    module.exports = {
      // webpack 进行打包的入口文件,这里 webpack 从根目录下的 index.js 开始进行打包
      entry: [
        './index'
      ],
      // webpack 打包后的输出文件的路径
      output: {
        path: path.join(__dirname, 'dist'), // 文件放至当前路径下的 dist 文件夹
        filename: 'bundle.js',  // 将打包后的输出文件命名为 bundle.js
      }
    }
    

      将HTML文件的引用路径改为:

    <script src="./dist/bundle.js"></script>
    

     再将webpack 安装在本地:

    npm install webpack --save-dev
    

     现在运行

    npm install index.js bundle.js
    

    刚开始会报错,但是你会发现生成了dist文件,在执行一次该命令,可以实现其效果。

    如果有两个js文件是如何处理:

    新建 a.js

    var a = 1;
    module.exports = a;
    

      在index.js中加入下列语句:

    var a = require("./a.js")//“./”表示当前目录
    console.log("a = ", a);

      再输入: npm index.js bundle.js 即可。

    现在我们不需要在index.html中用script 标签分别来引入 index.js 和 a.js两个文件了,直接引入 bundle.js 这一个就行了。 这种方式很适合当需要引用很多的资源时,简单方便。

    安装 web-dev-server

    npm i webpack-dev-server --save-dev
    

      新建server.js文件

    // server.js
    var webpack = require('webpack');
    var WebpackDevServer = require('webpack-dev-server');
    var config = require('./webpack.config.js');
    
    var server = new WebpackDevServer(webpack(config)); //创建了一个webpack dev server,这是一个
    //node.js express 服务器
    server.listen(3000, 'localhost', function(err, result) { if (err) { return console.log(err); } return console.log('listening at locahost:3000...'); })

      在webpack.config.js的output这一项中加上:

    publicPath :"/static"
    

      server.js修改为:

    var server = new WebpackDevServer(webpack(config), {
      publicPath: config.output.publicPath
    });  

    把 index.html 中对bundle.js 的引用路径改为: "./static/bundle.js"

    运行 node server.js   在浏览器中输入 http://localhost:3000查看效果

    在package.json中加上下面这一项

    "scripts": {
      "start": "node server.js"
    },//效果是: 可以用 npm start 来代替上面的 node server.js  这两者是等价的    有的教程里 写成 "start":"webpack",相当于把npm的start命令指向webpack命令
    

      Babel

    Babel 是转码器,可以将ES6代码转化为ES5代码。从而在现有的环境中执行。(由于ES6中有些语法还没有得到广泛支持)

    配置文件

    Babel 的配置文件是 .babelrc,存放在项目的根目录下。使用Babel之前,首先是配置这个文件。

    该文件是用来设置转码规则和插件的

    在项目中,需要安装这样几个package

    npm install --save-dev  babel-loader babel-core
    npm install  babel-preset-es2015 --save-dev
    npm install babel-preset-stage-0 --save-dev
    npm install babel-cli --save-dev

      在 .babelrc中写入如下内容:

    {
     ”presets”:["es2015", "stage-0"] //presets 字段设定转码规则,
    "plugins":[] }

      webpack.config.js 文件进行修改:

    module: {
      loaders: [{
        test: /.js$/,
        loaders: ['babel-loader'],  //注意:很多教程写的是 babel ,但是新版的webpack要求输入完整,不能丢弃loader
        include: path.join(__dirname, 'src')
      }]
    },
    devServer: {
      stats: 'errors-only'
    }
    

      

     安装React

    npm install react react-dom --save  // 安装react的package
    npm install babel-preset-react // 为了让babel对react进行处理
    

      在 .babelrc 文件中加入: "presets":["es2015","stage-0","react"]

    新建一个组件:

    在index.html 中加上这样的一个元素:

    <div id="app"></div> //在此部分进行渲染
    

      新建一个src文件夹,然后在src文件夹下新建两个文件 App.js  index.js

    ./src/index.js
    import React from 'react';
    import ReactDOM from 'react-dom';
    import App from './App.js';
    
    ReactDOM.render(
      <App />,
      document.getElementById('app')
    );

    ./src/App.js
    import React, { Component } from 'react';
    export default class App extends Component {
    render() {
    console.log('%c%s', 'font-size:20px;color:red', 'Something happened.');

    return (
    <div>This is a react boilerplate project with webpack and es6.</div>
    );
    };
    }

    可以用 npm start 查看效果

    安装 react-hot-loader 

    目的是:实现浏览器自动刷新的效果。 

    安装 react-hot-loader

    npm install react-hot-loader --save-dev
    

      在server.js 中加一行

    var server = new WebpackDevServer(webpack(config), {
      stats: config.devServer.stats,
      hot: true,
      publicPath: config.output.publicPath
    });
    

      webpack.config.js 修改如下:

    entry: [
      'webpack-dev-server/client?http://localhost:3000',
      'webpack/hot/only-dev-server',
      './src/index'
    ],
    
    loaders: [{
      test: /.js$/,
      loaders: ['react-hot-loader', 'babel'-loader], //注意加loader,还要注意顺序
      include: path.join(__dirname, 'src')
    }]

    plugins:[
    new webpack.HotModuleReplacementPlugin()
    ]

      

    到此模板项目完成

    输入 npm start, 运行效果为

  • 相关阅读:
    JVM内存模型
    052-224(新增70题2018)
    052-223(新增70题2018)
    052-222(新增70题2018)
    052-221(新增70题2018)
    052-220(新增70题2018)
    052-219(新增70题2018)
    052-218(新增70题2018)
    052-217(新增70题2018)
    052-216(新增70题2018)
  • 原文地址:https://www.cnblogs.com/ycbeginner/p/6963905.html
Copyright © 2011-2022 走看看