创建基本webpack4.x项目以及在项目中使用React

软件:visual studio code或者 webstorm2019.1.1

一、创建基本的webpack4.x项目

1、创建项目文件夹 webpack ,并用webstorm打开

2、打开终端Terminal,快速初始化一个项目:

1 npm init -y

  根目录下产生package.json文件。该文件定义了项目所需要的各个模块,以及项目的配置信息(比如名称、版本、许可证等元数据);该文件可以手工编写,也可以使用上述命令自动生成;npm install 命令会根据这个配置文件,自动下载所需要的模块,也就是配置项目所需要的运行和开发环境。package.json文件中添加中文注释会编译出错。

3、在项目根目录下安装 webpack 和 webpack-cli (两者需要同时安装),根目录下会产生一个node_modules文件夹。

1 cnpm i webpack webpack-cli -D

注意:使用 cnpm 命令前,需要先安装 cnpm。

npm i cnpm -g    //全局安装global

4、在项目根目录下创建 src 目录,在该目录下新建 index.html 和 index.js 文件。(html文件,输入!,再按Tab键会自动填充模板)

5、在项目根目录下创建 webpack.config.js 配置文件

module.exports = {
    mode: 'development', //mode模块有两种模式:developmentproduction,两种模式下main.js的大小不同,前大后小,进行了代码压缩
}

6、最后,在终端执行 webpack 进行打包,生成 dist/main.js 目录文件,将 main.js 引入 index.html 中即可。(复制HTML文件路径,在浏览器中打开)

1 <body>
2   <div>hehehe</div>
3   <script src="../dist/main.js"></script>
4 </body>

二、项目实时刷新

a、webpack-dev-server配置

cnpm install webpack-dev-server -g //全局安装
cnpm install webpack-dev-server -D //项目局部安装

b、在package.json 文件中的 "scripts" 中加入 “dev”

"scripts": {
    "test": "echo "Error: no test specified" && exit 1",
    "dev" : "webpack-dev-server --open chrome --port3000" //自动打开浏览器Chrome,端口号3000
  },

 c、运行,结果如下图页面。

npm run dev

注意:1)若出现 cannot find module '名' ,可以执行 cnpm install -g 名 和 cnpm install -D 名 ;2)考虑node版本问题

         

    2)浏览器没有刷新是因为 webpack-dev-server 构建的 main.js ,其实是在 http://localhost:3000/main.js的位置,被托管到内存中,所以直接在index.html文件中引入:

<script src="/main.js"></script>

3)将index.html也放到内存中,减少磁盘的损耗,命令如下:

cnpm i html-webpack-plugin -D

在 webpack.config.js 中引入并配置导出:

const path = require('path');
const HtmlWebPackPlugin = require('html-webpack-plugin');//导入在内容中自动生成index页面的插件

//创建一个插件的实例对象
const htmlPlugin = new HtmlWebPackPlugin({
    template: path.join(__dirname, './src/index.html'),//源文件
    filename: 'index.html' //生成内存中的首页名称
});

module.exports = {
    mode: 'development', //mode模块有两种模式:developmentproduction,两种模式下main.js的大小不同,前大后小,进行了代码压缩
    plugins: [
        htmlPlugin
    ]
}

该操作直接将 index.html 放到了内存中,并自动引入了自动打包生成的 main.js 文件。重新运行npm run dev,结果如下:(其中荧光部分自动生成)

  

注意:每次修改 webpack.config.js 文件都需要重新运行 npm run dev;快捷键ctrl+C:终止编译。

三、在项目中使用React

 1、在项目目录下安装包:

cnpm i react react-dom -S
  • react:专门用于创建组件和虚拟DOM,同时组件的生命周期都在这个包中;
  • react-dom:专门进行DOM操作,最主要的应用场景就是ReactDOM.render()。

1.1-----index.js文件

 1 //a、导入包:注意成员名称大小写;规定!!!
 2 import React from 'react'
 3 import ReactDOM from 'react-dom'
 4 
 5 //b、用React创建虚拟DOM元素(包含3个参数)
 6 //第一个参数:创建元素类型;字符串形式,表示元素名称(标签名)。
 7 //第二个参数:是一个对象或者null;表示当前该DOM元素的属性。
 8 //第三个参数:子节点(包括其他的虚拟DOM、文本子节点等)。。。参数n为其他子节点。
 9 const myh1 = React.createElement('h1',{id:'myh1',title:'this is a h1'},'这是h1的文本内容');
10 
11 //c、用ReactDOM把虚拟DOM渲染到页面上(2个类型参数)
12 //参数1:纯js或jsx创建的虚拟DOM对象;
13 //参数2:指定页面上(index.html)的一个容器,用来包含虚拟DOM元素的真实DOM元素对象(一般是一个div)。
14 ReactDOM.render(myh1,document.getElementById("app"))

1.2-----index.html文件

 1 <!doctype html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <meta name="viewport"
 6           content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
 7     <meta http-equiv="X-UA-Compatible" content="ie=edge">
 8     <title>Document</title>
 9 </head>
10 <body>
11 <!--在index.html中,创建一个容器,渲染虚拟DOM元素,会放到容器内显示-->
12 <div id="app"></div>
13 
14 <script src="/main.js"></script>
15 </body>
16 </html>

2、创建虚拟DOM的方式有两种,上面的index.js文件中的第一种创建方式一般不用;

创建虚拟DOM的第二种方法:JSX

2.1-----什么是虚拟DOM?

  a)DOM的本质:浏览器的概念,用JS对象来表示页面上的元素,并提供了操作DOM对象的API;

  b)React中的虚拟DOM:框架中的概念,是程序员用JS对象来来模拟页面上的DOM元素和DOM嵌套;

  c)虚拟DOM的目的:为实现页面中DOM元素的高效更新。

2.2-----JSX

  a)在JS文件中,默认不能写这种类似于html的文件,否则会打包失败;但可以用 babel 来转换这些JS中的标签;

  b)在JS文件中,混合写入类似于HTML的语法,叫做JSX语法,是符合XML规范的JS;

  c)JSX语法的本质:是在运行的时候,被转换成React.createElement形式再渲染,不是直接把jsx语句渲染到页面上。

2.3-----如何启用JSX语法

  1、安装 babel 插件

cnpm i @babel/core babel-loader @babel/plugin-transform-runtime -D
cnpm i @babel/preset-env @babel/preset-stage-0 -D

  2、安装能够识别转换JSX语法的包(将JS转换成React.createElement)

cnpm i @babel/preset-react -D

  3、安装完上面1,2插件,在 webpack.config.js中进行配置,增加module块。

const path = require('path');
const HtmlWebPackPlugin = require('html-webpack-plugin');//导入在内容中自动生成index页面的插件

//创建一个插件的实例对象
const htmlPlugin = new HtmlWebPackPlugin({
    template: path.join(__dirname, './src/index.html'),//源文件
    filename: 'index.html' //生成内存中的首页名称
});

module.exports = {
    mode: 'development', //mode模块有两种模式:developmentproduction,两种模式下main.js的大小不同,前大后小,进行了代码压缩
    plugins: [
        htmlPlugin
    ],
    module:{  //所有第三方模块的配置规则
        rules: [  //第三方匹配规则
            {test: /.js|jsx$/, use:'babel-loader', exclude: /node_modules/},
            //使用use必须添加exclude排除项,否则跑不起来
        ]
    }

}

  4、在项目根目录下创建 .babelrc配置文件(不能单引号,不能注释)

{
  "presets": ["@babel/preset-env","@babel/preset-react"],
  "plugins": ["@babel/plugin-transform-runtime"]
}

2.4-----在JSX中书写JS代码注意

  • 在JSX语法中,要把JS代码写到{ }中
  • 在JSX语法中,标签必须成对出现;如果是单标签,必须自闭和;
  • 当编译引擎在编译JSX代码时,如果遇到<>,就当做HTML代码去编译;如果遇到了{ }就把花括号内部代码当做普通JS去处理。
原文地址:https://www.cnblogs.com/minyDong/p/10862644.html