React 使用webpack构建React项目

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了React 使用webpack构建React项目相关的知识,希望对你有一定的参考价值。

参考技术A 配置 React 项目,需要完成的工作:

1、编译 jsx,es6,scss 等资源

2、自动引入静态资源到 html 页面

3、实时编译和刷新浏览器

4、按指定模块化规范自动包装模块

5、自动给 css 添加浏览器内核前缀

6、按需打包合并 js、css

根据 webpack 文档编写最基本的 webpack 配置,直接使用 node api 的方式

/* webpack.config.js */

var webpack= require( 'webpack' );

// 辅助函数  var utils= require( './utils' );

var fullPath=utils.fullPath;

var pickFiles=utils.pickFiles;

// 项目根路径  var ROOT_PATH=fullPath( '../' );

// 项目源码路径  var SRC_PATH=ROOT_PATH+ '/src' ;

// 产出路径  var DIST_PATH=ROOT_PATH+ '/dist' ;

// 是否是开发环境  var __DEV__= process.env. NODE_ENV !== 'production' ;

// conf

var alias=pickFiles(

id :/(conf\/[^\/]+).js$/,

pattern :SRC_PATH+ '/conf/*.js'

);

// components

alias= Object.assign(alias,pickFiles(

id :/(components\/[^\/]+)/,

pattern :SRC_PATH+ '/components/*/index.js'

));

// reducers

alias= Object.assign(alias,pickFiles(

id :/(reducers\/[^\/]+).js/,

pattern :SRC_PATH+ '/js/reducers/*'

));

// actions

alias= Object.assign(alias,pickFiles(

id :/(actions\/[^\/]+).js/,

pattern :SRC_PATH+ '/js/actions/*'

));

var config=

context :SRC_PATH,

entry :

app : [ './pages/app.js' ]

,

output :

path :DIST_PATH,

filename : 'js/bundle.js'

,

module : ,

resolve :

alias :alias

,

plugins : [

new webpack.DefinePlugin(

// http://stackoverflow.com/questions/30030031/passing-environment-dependent-variables-in-webpack

"process.env.NODE_ENV" : JSON .stringify(process.env. NODE_ENV || 'development' )

)

]

;

module.

exports =config;

/* webpack.dev.js */

var webpack= require( 'webpack' );

var WebpackDevServer= require( 'webpack-dev-server' );

var config= require( './webpack.config' );

var utils= require( './utils' );

var PORT=8080;

var HOST=utils.getIP();

var args= process.argv;

var hot=args.indexOf( '--hot' ) > -1;

var deploy=args.indexOf( '--deploy' ) > -1;

// 本地环境静态资源路径  var localPublicPath= 'http://' +HOST+ ':' +PORT+ '/' ;

config.output. publicPath =localPublicPath;

config.entry.app.unshift( 'webpack-dev-server/client?' +localPublicPath);

new WebpackDevServer(webpack(config),

hot :hot,

inline : true ,

compress : true ,

stats :

chunks : false ,

children : false ,

colors : true

,

// Set this as true if you want to access dev server from arbitrary url.

// This is handy if you are using a html5 router.

historyApiFallback : true ,

).listen(

PORT,HOST, function ()

console .log(localPublicPath);

);

编译 jsx、es6、scss 等资源:

● 使用 bael 和 babel-loader 编译 jsx、es6

● 安装插件: babel-preset-es2015 用于解析 es6

● 安装插件:babel-preset-react 用于解析 jsx

// 首先需要安装 babel

$ npm i babel-core

// 安装插件

$ npm i babel-preset-es2015babel-preset-react

// 安装 loader

$ npm i babel-loader

在项目根目录创建 .babelrc 文件:



"presets" : [ "es2015" , "react" ]



在 webpack.config.js 里添加:

// 使用缓存 var CACHE_PATH = ROOT_PATH + '/cache' ;

// loaders

config.module. loaders = [];

// 使用 babel 编译 jsx 、 es6

config.module. loaders .push(

test :/\.js$/,

exclude :/node_modules/,

include : SRC_PATH,

// 这里使用  loaders ,因为后面还需要添加  loader

loaders : [ 'babel?cacheDirectory=' + CACHE_PATH ]

);

接下来使用 sass-loader 编译 sass:

$ npm i sass-loader node-sasscss-loader style-loader

●css-loader 用于将 css 当做模块一样来 import

●style-loader 用于自动将 css 添加到页面

在 webpack.config.js 里添加:

// 编译  sass

config.module. loaders .push(

test :/\.(scss|css)$/,

loaders : [ 'style' , 'css' , 'sass' ]

);

自动引入静态资源到相应 html 页面

● 使用 html-webpack-plugin

$ npm i html-webpack-plugin

在 webpack.config.js 里添加:

// html  页面  var HtmlwebpackPlugin= require( 'html-webpack-plugin' );

config.

plugins .push(

new HtmlwebpackPlugin(

filename : 'index.html' ,

chunks : [ 'app' ],

template : SRC_PATH + '/pages/app.html'

)

);

打包合并 js、css

webpack 默认将所有模块都打包成一个 bundle,并提供了 Code Splitting 功能便于我们按需拆分。在这个例子里我们把框架和库都拆分出来:

在 webpack.config.js 添加:

config.entry. lib = [

'react' , 'react-dom' , 'react-router' ,

'redux' , 'react-redux' , 'redux-thunk'

]

config.output. filename = 'js/[name].js' ;

config.

plugins .push(

new webpack.optimize.CommonsChunkPlugin( 'lib' , 'js/lib.js' )

);

// 别忘了将  lib  添加到  html  页面

// chunks: ['app', 'lib']

React-Webpack-production 构建不适用于 nginx

【中文标题】React-Webpack-production 构建不适用于 nginx【英文标题】:React-Webpack-production build is not working on nginx 【发布时间】:2022-01-22 21:56:45 【问题描述】:

我在反应应用程序中使用 webpack 5.64.1。在我运行命令“npm run build”之后。我在我的项目中获得构建文件夹。我将 build 文件夹中的所有文件上传到 /usr/share/nginx/html/

这是我的 nginx 配置文件

server 
    listen       80;

    listen 443 ssl;

    server_name *********;
    
    ssl_certificate /etc/ssl/certs/fullchain.pem;
    ssl_certificate_key /etc/ssl/certs/privkey.pem;

    root   /usr/share/nginx/html;
    index  index.html index.htm;
    
    location / 

        try_files $uri /index.html;

    
    
    access_log /var/log/nginx/*****-access.log;
    error_log /var/log/nginx/******.com-error.log;

当我使用浏览器访问我的网站时,它会在控制台中生成以下错误

1-Uncaught SyntaxError: Unexpected token '

在检查了它的网络选项卡后,我意识到这些文件的预览不可用。虽然这些返回 200 状态代码。

提前谢谢你

【问题讨论】:

【参考方案1】:

你有没有先在public/文件夹下创建manifest.json文件?

这是示例 manifest.json


  "short_name": "React App",
  "name": "Create React App Sample",
  "icons": [
    
      "src": "favicon.ico",
      "sizes": "64x64 32x32 24x24 16x16",
      "type": "image/x-icon"
    ,
  ],
  "start_url": ".",
  "display": "standalone",
  "theme_color": "#000000",
  "background_color": "#ffffff"

【讨论】:

以上是关于React 使用webpack构建React项目的主要内容,如果未能解决你的问题,请参考以下文章

webpack+gulp 构建react项目

Webpack / Babel / React 构建错误:“未知选项:foo/node_modules/react/react.js.Children”

webpack构建react多页面应用

webpack构建react项目的配置文件

使用别名配置 Webpack 4,Babel 7 构建 React 组件库

webpack踩坑之路——构建基本的React+ES6项目