webpack:一个前端资源加载/打包工具
项目中需要处理的文件一般会使用的插件:
node、cnpm/yarn,创建一个react-test(随便起)空目录存放项目文件
cd react-test
npm init
npm install webpack webpack-cli --save-dev(请安装webpack v3的版本,最新v4有些插件不兼容,会出现坑)
–save-dev与–save的区别
在react-test目录创建webpack.config.js文件:
mkdir webpack.config.js
写入相关配置
const path = require('path');
module.exports = {
entry: './src/app.jsx', //入口文件
output: { //输出文件
// path:生成的文件要放在哪个位置
// __dirname是node.js中的一个全局变量,它指向当前执行脚本所在的目录
path: path.resolve(__dirname, 'dist'),
filename: 'js/app.js' // 生成文件的名称
}
}
因为我这里webpack不是全局安装的,所以可以在控制台直接通过 .\node_modules\.bin\webpack 命令来运行打包。
打包成功后就可以在根目录看到一个dist文件,里面包含新生产的js文件。
npm install webpack-dev-server --save-dev
//webpack.config.js
module.exports = {
entry: './src/app.jsx', //入口文件
output: { //输出文件
// path:生成的文件要放在哪个位置
// __dirname是node.js中的一个全局变量,它指向当前执行脚本所在的目录
path: path.resolve(__dirname, 'dist'),
filename: 'js/app.js' // 生成文件的名称
},
devServer:{
port: 8086
}
}
//package.json
"scripts": {
"dev": "node_modules/.bin/webpack-dev-server"
},
接着,就可以在控制台输入 npm run dev 运行项目,地址:http://localhost:8086
接下来代码中会用到ES6的语法和jsx,所以先把babel和react装上
npm insatll react react-dom react-router-dom --save
npm install @babel/core babel-loader @babel/preset-env @babel/preset-react --save-dev
在安装成功后必须进行babel的配置,在根目录react-test建立.babelrc文件,然后写入以下配置
{
"presets": ["@babel/preset-env", "@babel/preset-react"]
}
接着,在webpack.config.js 的module中添加rules规则
module:{
rules:[
{
test: /\.(js|jsx)$/,
exclude: /(node_modules)/, //排除node_modules
use: {
loader: 'babel-loader',
}
}
]
}
import React from 'react';
import ReactDOM from 'react-dom';
class App extends React.Component{
render(){
return 测试的组件
}
}
ReactDOM.render(
,
document.getElementById('app')
)
npm install html-webpack-plugin html-loader --save-dev
配置规则:
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
entry: './src/app.jsx', //入口文件
output: { //输出文件
//path:生成的文件要放在哪个位置 __dirname是node.js中的一个全局变量,它指向当前执行脚本所在的目录
path: path.resolve(__dirname, 'dist'),
filename: 'js/app.js' // 生成文件的名称
},
module:{
rules: [
{
test: /\.(js|jsx)$/,
exclude: /(node_modules)/,
use: {
loader: 'babel-loader',
}
},
{
test: /\.html$/,
use: {
loader: 'html-loader'
}
},
]
},
plugins: [
new HtmlWebpackPlugin({
template: './src/index.html',
})
]
}
npm install style-loader css-loader --save-dev
npm install sass-loader node-sass --save-dev
配置规则,把代码放到rules里面:
{
test: /\.css$/,
use: [ 'style-loader', 'css-loader' ]
},
{
test: /\.scss$/,
use: [{
loader: "style-loader" // 将 JS 字符串生成为 style 节点
}, {
loader: "css-loader" // 将 CSS 转化成 CommonJS 模块
}, {
loader: "sass-loader" // 将 Sass 编译成 CSS
}]
},
我们可以在src目录下创建一个index.scss,style.css,并且写上样式。接着在app.jsx文件中引入
import './style.css';
import './index.scss';
// index.scss的样式
p{
font-size:30px;
color: red;
}
//style.css的样式
body{
padding:0;
margin:0;
background-color: pink;
}
最后运行 npm run dev打包
打开http://localhost:8086,就可以看到效果了,eg:
4. 但是我们现在打包的css是包含在打包后的dist/js/app.js文件里面的,所以我们要把它抽取出来。使用到的是extract-text-webpack-plugin插件
.hooks
instead 。npm install extract-text-webpack-plugin@next --save-dev
;或者直接安装webpack v3的版本// 1、引入extract-text-webpack-plugin
const ExtractTextPlugin = require('extrack-text-webpack-plugin');
// 2、在plugin中创建ExtractTextPlugin实例
plugins: [
new HtmlWebpackPlugin({
template: './src/index.html',
}),
new ExtractTextPlugin("css/[name].css") //提取css
]
// 3、修改之前的css,scss规则
{
test: /\.css$/,
use: ExtractTextPlugin.extract({
fallback: "style-loader",
use: "css-loader"
})
},
{
test: /\.scss$/,
use: ExtractTextPlugin.extract({
fallback: 'style-loader',
use: ['css-loader', 'sass-loader']
})
},
const webpack = require('webpack');
//CommonChunkPlugin:在plugin中创建实例
plugins: [
//处理html文件
new HtmlWebpackPlugin({
template: 'src/index.html'
}),
//独立css文件
new ExtractTextPlugin("css/[name].css"),
//提出公共模块
new webpack.optimize.CommonsChunkPlugin({
name: 'common',
filename: 'js/base.js'
})
],
//SplitChunksPlugin:
optimization:{
splitChunks: {
cacheGroups: {
vendor: {
name: "vendor",
test: /[\\/]node_modules[\\/]/, //打包第三方库
chunks: "all",
priority: 10 // 优先级
},
commons: { // 打包其余的的公共代码
name: "commons", // 分离包的名字
chunks: "initial",
minChunks: 2 // 引入两次及以上被打包
}
}
}
}
npm install file-loader url-loader --save-dev
output: {
path: path.resolve(__dirname, 'dist'),
publicPath: '/dist/', //指定资源文件引用的目录
filename: 'js/app.js'
},
{
test: /\.(png|jpg|gif)$/i,
use: [
{
loader: 'url-loader', //使用
options: {
limit: 8192,
name: 'resource/[name].[ext]'
},
},
],
},
module.exports = {
........
resolve:{
alias:{
page: path.resolve(__dirname, 'src/page')
}
},
}
// 使用:
import Test from 'page/home/index.jsx'
关于react的webpack配置还有很多,例如代理,配置字体规则等等,在实际的项目中按需要去添加。
大家一起学习进步,加油!