react-从零开始搭建项目-webpack配置
上一篇
前言
上一篇我们简单搭建了一个项目目录,但是发现无法将html文件与index.js文件连接起来,也无法使用ES Module的import语法,更无法编译JSX语法为JS,为了解决这些问题,我们需要把webpack配置起来。
本文不是专业的webpack介绍,只是简单的使用
我理解的webpack
webpack,顾名思义,给web打个包,意思就是将显示web需要的资源整合到一起(打包起来),有相关的loader使得webpack可以打包无法理解的文件,还有相关插件对项目进行优化。但是这里就不多说这些了,这次主要是使用webpack打包个react项目。那我们开始配置一下webpack吧。
在项目中配置webpack
尝试安装与打包
首先我们安装一个全局webpack及webpack-cli的包(全局安装后才可以在命令行使用webpack):npm i webpack webpack-cli -g
再运行:npm install -D webpack webpack-cli@3
,开发环境中需要用到webpack包,热更新实现时需要webpack-cli@3 最好用3,4会报错
安装完成后,试着将 .src/index.js文件打包一下:webpack ./src/index.js -o ./dist/js --mode=development
发现报错了
假设去掉./src/index.js文件的JSX语法及import语法的话,还是可以打包成功的
错误原因很简单,webpack无法理解JSX语发及import语法,我们需要一些loader,需要好几个翻译官。 那怎么引入loader呢?
配置webpack.config.js
在项目中关于webpack的配置我们一般会放到这个文件中:webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.js$/,
loader: 'babel-loader',
options: {
presets: ['env', 'react']
}
}
]
}
}
首先我们配置了loader: 'babel-loader', options: { presets: ['env', 'react'] }
,就需要安装相应的依赖,不然是不会生效的。
npm install babel babel-cli babel-loader@7 babel-core babel-preset-env babel-preset-react --save-dev
在这里很容易遇到babel版本不对使得打包失败的问题,babel-loader8 对应的 babel-core版本为:7,我这里用到的babel-loade是7,所以不用担心这个问题
命令行直接运行webpack
,可以看到项目的dist文件夹下生成了一个main.js文件:
说明JSX编译成功,js文件打包成功 在HTML文件下我们引入这个js文件,
<body>
<div id="root"></div>
<script src="../dist/main.js"></script>
</body>
import React from 'react';
import ReactDOM from 'react-dom';
const App = () => (
<div>
<p>hello react</p>
</div>
);
ReactDOM.render(<App/>,document.getElementById('root'));
在浏览器中打开文件,可以看到我们的react组件显示在了浏览器中
这里还有一个问题:文件dist/main.js是我们手动引入的,假设以后打包的文件多了,我都要一个个引入吗?所以这里我们可以使用一个webpack插件来帮忙:html-webpack-plugin
首先安装:npm i html-webpack-plugin -D
将我们之前手动引入的js删除:
<body>
<div id="root"></div>
</body>
修改webpack.config.js
文件
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
module: {
rules: [
{
test: /\.js$/,
loader: 'babel-loader',
options: {
presets: ['env', 'react']
}
}
]
},
plugins: [
new HtmlWebpackPlugin({
template: './public/index.html'
})
]
}
大概的意思是以./public/index.html为模板,将打包好的文件引入到这个html中,重新打包后我们拿到了这个结果:
这里有点好奇,为啥打包放到head标签里面去了?
加上这个配置就可以解决了:inject: 'body'
plugins: [
new HtmlWebpackPlugin({
template: './public/index.html',
inject: 'body'
})
],
总结
通过这次的尝试,我们成功将一个react组件,通过webpack打包后运行在了浏览器中,但是很明显,这和我们日常开发中的情况有点不一样,怎么是静态文件打开的呢?localhost:3000呢?热更新呢?这个正是下一篇我们要继续尝试的。
下一篇
转载自:https://juejin.cn/post/6991627519833309215