webpack配置以及下载模块

下载

yarn add webpack webpack-cli --dev

参考版本:yarn add webpack@4.41.5 webpack-cli@3.3.10 --dev

实现步骤:

a安装webpack

yarn add webpack@4.41.5 webpack-cli@3.3.10 --dev

b 修改package.json文件中的scripts键

“build”: “webpack --mode=production”

c 创建src\index.js

console.log(‘hello,webopenfather’)

d 测试打包

yarn build

■webpack配置 ( webpack.config.js

默认入口(entry):src/index.js

默认出口(output):dist/main.js

疑惑:如果想自定义呢?

解决:在项目根目录声明webpack.config.js

2、指定入口&出口

查看手册

练习

a 练习:将src/index.js改为src/qf.js -> 重新build 发现报错因为入口文件不存在 index.js

b 解决:在项目根目录下创建webpack.config.js文件,重写默认入口文件

c 自定义输出打包文件名

// 导入模块
const path = require('path')

// 导出配置
module.exports = {
    // 指定入口文件
    // entry: './src/index.js',  默认
    entry: './src/qf.js',//      指定

    // 指定出口文件
    output: {
        // 说明:path.resolve 这是使用node中path模块的方法
        // 作用:目录分隔符  linux/mac系统  / 斜杠  win系统 \ 反斜杠
        // 说明:__dirname这是node中的变量  值是动态变化
        // 作用:获取当前文件所在目录路径  webpack.config.js
        // 含义:当前文件所在目录/dist
        path: path.resolve(__dirname, 'dist'),
        filename: 'qf.js'
    }
};

3、多入口&出口

需求:创建home.js和about.js打包

代码:如下

// 导入模块
const path = require('path')

// 导出配置
module.exports = {
    // 指定入口文件
    // entry: './src/index.js',  默认
    // entry: './src/qf.js',//   指定
    entry: {
        qf: './src/qf.js',
        home: './src/home.js',
        about: './src/about.js'
    },

    // 指定出口文件
    output: {
        // 说明:path.resolve 这是使用node中path模块的方法
        // 作用:目录分隔符  linux/mac系统  / 斜杠  win系统 \ 反斜杠
        // 说明:__dirname这是node中的变量  值是动态变化
        // 作用:获取当前文件所在目录路径  webpack.config.js
        // 含义:当前文件所在目录/dist
        path: path.resolve(__dirname, 'dist'),

        // 默认HTTP请求状态码:200  有请求 、有响应数据
        // 然后浏览器都有缓存机制:304 有请求、有响应【没】有数据  数据来源于浏览器缓存
        // 如果你看过我之前在课件中发的nginx里面有一个词:expires 、gzip  直接不发送请求
        // 缓存机制:文件名  用户第1次访问后根据文件名缓存,第2次就不发送请求
        // 问题:每次项目build上线文件名都一样
        // 你跟新、但是文件名都一样用户还是用的以前的js、css新功能没办法实现.
        // 解决:每次build之后都会产生一个新的文件名
        // filename: 'qf.js'                 // 单个
        // filename: '[name].js'             // 多个 
        // filename: '[name].[hash].js'      // 避免缓存 
        // filename: '[name].[hash:7].js'    // 截取指定 
        filename: '[name].[chunkhash:7].js'  // 内容hash 
        
        // 区别:hash每次都会有一个唯一的标识 只要内容变了 全部重新生成
        //      chunkhash基于每个文件的内容 修改了 只会这个文件重新生成
    }
};

4、配置文件位置

默认:打包去项目根目录下找webpack.config.js配置文件

需求:创建scripts目录,将webpack.config.js放进去

发现:更改配置文件路径报错,

解决:声明配置文件所在目录


实现:

a. 创建scripts目录,将webpack.config.js放进去

b. 修改package.json声明配置文件路径
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mtLk422s-1598448775353)(images/1588821252931.png)]

c. 修改webpack.config.js存在BUG
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zVvufPHX-1598448775354)(images/1588821269623.png)]

■插件配置

3、练习

步骤1:安装

yarn add --dev html-webpack-plugin

步骤2:创建public目录\index.html文件

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <meta http-equiv="X-UA-Compatible" content="ie=edge">
 <!-- <title>自己造React脚手架</title> -->
 <title><%= htmlWebpackPlugin.options.title %></title>
</head>
<body>
 <div id="root"></div>
</body>
</html>

步骤3:根据手册修改webpack.config.js文件

// 导入模块
const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')

// 导出配置
module.exports = {
 // 指定入口文件
 // entry: './src/index.js',  默认
 // entry: './src/qf.js',//   指定
 entry: {
     qf: './src/qf.js',
     home: './src/home.js',
     about: './src/about.js'
 },

 // 指定出口文件
 output: {
     // 说明:path.resolve 这是使用node中path模块的方法
     // 作用:目录分隔符  linux/mac系统  / 斜杠  win系统 \ 反斜杠
     // 说明:__dirname这是node中的变量  值是动态变化
     // 作用:获取当前文件所在目录路径  webpack.config.js
     // 含义:当前文件所在目录/dist
     // path: path.resolve(__dirname, 'dist'),

     // 说明:process是node进程模块、全局变量不需要引入直接使用
     // 语法:process.cwd() 获取当前DOS窗口指定命令路径
     // 咱们:一般都是在项目根目录下执行
     path: path.resolve(process.cwd(), 'dist'),

     // 默认HTTP请求状态码:200  有请求 、有响应数据
     // 然后浏览器都有缓存机制:304 有请求、有响应【没】有数据  数据来源于浏览器缓存
     // 如果你看过我之前在课件中发的nginx里面有一个词:expires 、gzip  直接不发送请求
     // 缓存机制:文件名  用户第1次访问后根据文件名缓存,第2次就不发送请求
     // 问题:每次项目build上线文件名都一样
     // 你跟新、但是文件名都一样用户还是用的以前的js、css新功能没办法实现.
     // 解决:每次build之后都会产生一个新的文件名
     // filename: 'qf.js'                 // 单个
     // filename: '[name].js'             // 多个 
     // filename: '[name].[hash].js'      // 避免缓存 
     // filename: '[name].[hash:7].js'    // 截取指定 
     filename: '[name].[chunkhash:7].js'  // 内容hash 
     
     // 区别:hash每次都会有一个唯一的标识 只要内容变了 全部重新生成
     //      chunkhash基于每个文件的内容 修改了 只会这个文件重新生成
 },
 plugins: [
     //说明:功能让webpack变得更强
     //作用:给public/index.js自动引入打包后的js等文件
     //new HtmlWebpackPlugin()
     new HtmlWebpackPlugin({
         // 自定义变量
         title: "神龙教主WEBPACK脚手架",
         desc: "神龙教主、洪福齐天、寿与天齐",
         // 输出到dist下面的名称、默认index.html
         filename: 'index.html',
         // 模板文件
         template: 'public/index.html'
     })
 ]
};

步骤4:测试 重新build

■loaders 配置(css-loader)

1、明确需求

说明:在写项目时,我们需要在js中导入css 可是默认js又不支持css语法

回答:通过css-loader模块

2、练习

  • 发现问题

步骤1:创建qf.css文件

html,body{background:red;}

步骤2:在qf.js中引入qf.css

import './qf.css'

console.log('hello,webopenfather')

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uBcD5qs2-1598448775356)(images/1588822532944.png)]

  • 解决问题

https://www.npmjs.com/package/css-loader

步骤1:安装模块

yarn add --dev style-loader css-loader

步骤2:根据手册修改配置文件

// 导入模块
const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')

// 导出配置
module.exports = {
// 指定入口文件
// entry: './src/index.js',  默认
// entry: './src/qf.js',//   指定
entry: {
  qf: './src/qf.js',
  home: './src/home.js',
  about: './src/about.js'
},

// 指定出口文件
output: {
  // 说明:path.resolve 这是使用node中path模块的方法
  // 作用:目录分隔符  linux/mac系统  / 斜杠  win系统 \ 反斜杠
  // 说明:__dirname这是node中的变量  值是动态变化
  // 作用:获取当前文件所在目录路径  webpack.config.js
  // 含义:当前文件所在目录/dist
  // path: path.resolve(__dirname, 'dist'),

  // 说明:process是node进程模块、全局变量不需要引入直接使用
  // 语法:process.cwd() 获取当前DOS窗口指定命令路径
  // 咱们:一般都是在项目根目录下执行
  path: path.resolve(process.cwd(), 'dist'),

  // 默认HTTP请求状态码:200  有请求 、有响应数据
  // 然后浏览器都有缓存机制:304 有请求、有响应【没】有数据  数据来源于浏览器缓存
  // 如果你看过我之前在课件中发的nginx里面有一个词:expires 、gzip  直接不发送请求
  // 缓存机制:文件名  用户第1次访问后根据文件名缓存,第2次就不发送请求
  // 问题:每次项目build上线文件名都一样
  // 你跟新、但是文件名都一样用户还是用的以前的js、css新功能没办法实现.
  // 解决:每次build之后都会产生一个新的文件名
  // filename: 'qf.js'                 // 单个
  // filename: '[name].js'             // 多个 
  // filename: '[name].[hash].js'      // 避免缓存 
  // filename: '[name].[hash:7].js'    // 截取指定 
  filename: '[name].[chunkhash:7].js'  // 内容hash 
  
  // 区别:hash每次都会有一个唯一的标识 只要内容变了 全部重新生成
  //      chunkhash基于每个文件的内容 修改了 只会这个文件重新生成
},
module: {
  rules: [
      {
          test: /\.css$/i,
          use: ['style-loader', 'css-loader'],
      },
  ],
},
plugins: [
  //说明:功能让webpack变得更强
  //作用:给public/index.js自动引入打包后的js等文件
  //new HtmlWebpackPlugin()
  new HtmlWebpackPlugin({
      // 自定义变量
      title: "cyy的脚手架",
      desc: "vixx",
      // 输出到dist下面的名称、默认index.html
      filename: 'index.html',
      // 模板文件
      template: 'public/index.html'
  })
]
};

3、使用mini-css-extract-plugin优化

发现:css没有单独打包,引入

解决:通过第三方插件mini-css-extract-plugin

代码:https://www.npmjs.com/package/mini-css-extract-plugin

步骤1:安装模块

yarn add mini-css-extract-plugin --dev

步骤2:修改webpack.config.js

// 导入模块
const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const MiniCssExtractPlugin = require('mini-css-extract-plugin');

// 导出配置
module.exports = {
    // 指定入口文件
    // entry: './src/index.js',  默认
    // entry: './src/qf.js',//   指定
    entry: {
        qf: './src/qf.js',
        home: './src/home.js',
        about: './src/about.js'
    },

    // 指定出口文件
    output: {
        // 说明:path.resolve 这是使用node中path模块的方法
        // 作用:目录分隔符  linux/mac系统  / 斜杠  win系统 \ 反斜杠
        // 说明:__dirname这是node中的变量  值是动态变化
        // 作用:获取当前文件所在目录路径  webpack.config.js
        // 含义:当前文件所在目录/dist
        // path: path.resolve(__dirname, 'dist'),

        // 说明:process是node进程模块、全局变量不需要引入直接使用
        // 语法:process.cwd() 获取当前DOS窗口指定命令路径
        // 咱们:一般都是在项目根目录下执行
        path: path.resolve(process.cwd(), 'dist'),

        // 默认HTTP请求状态码:200  有请求 、有响应数据
        // 然后浏览器都有缓存机制:304 有请求、有响应【没】有数据  数据来源于浏览器缓存
        // 如果你看过我之前在课件中发的nginx里面有一个词:expires 、gzip  直接不发送请求
        // 缓存机制:文件名  用户第1次访问后根据文件名缓存,第2次就不发送请求
        // 问题:每次项目build上线文件名都一样
        // 你跟新、但是文件名都一样用户还是用的以前的js、css新功能没办法实现.
        // 解决:每次build之后都会产生一个新的文件名
        // filename: 'qf.js'                 // 单个
        // filename: '[name].js'             // 多个 
        // filename: '[name].[hash].js'      // 避免缓存 
        // filename: '[name].[hash:7].js'    // 截取指定 
        filename: '[name].[chunkhash:7].js'  // 内容hash 
        
        // 区别:hash每次都会有一个唯一的标识 只要内容变了 全部重新生成
        //      chunkhash基于每个文件的内容 修改了 只会这个文件重新生成
    },
    module: {
        rules: [
            {
                test: /\.css$/i,
                // use: ['style-loader', 'css-loader'],
                use: [MiniCssExtractPlugin.loader, 'css-loader'],
            },
        ],
    },
    plugins: [
        //说明:功能让webpack变得更强
        //作用:CSS单独文件存放
        new MiniCssExtractPlugin({
            filename: '[name].css',
        }),
        //作用:给public/index.js自动引入打包后的js等文件
        //new HtmlWebpackPlugin()
        new HtmlWebpackPlugin({
            // 自定义变量
            title: "神龙教主WEBPACK脚手架",
            desc: "神龙教主、洪福齐天、寿与天齐",
            // 输出到dist下面的名称、默认index.html
            filename: 'index.html',
            // 模板文件
            template: 'public/index.html'
        })
    ]
};

步骤3:重新build

4、打包文件分类存放

static/js

static/css

// 导入模块
const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const MiniCssExtractPlugin = require('mini-css-extract-plugin');

// 导出配置
module.exports = {
    // 指定入口文件
    // entry: './src/index.js',  默认
    // entry: './src/qf.js',//   指定
    entry: {
        qf: './src/qf.js',
        home: './src/home.js',
        about: './src/about.js'
    },

    // 指定出口文件
    output: {
        // 说明:path.resolve 这是使用node中path模块的方法
        // 作用:目录分隔符  linux/mac系统  / 斜杠  win系统 \ 反斜杠
        // 说明:__dirname这是node中的变量  值是动态变化
        // 作用:获取当前文件所在目录路径  webpack.config.js
        // 含义:当前文件所在目录/dist
        // path: path.resolve(__dirname, 'dist'),

        // 说明:process是node进程模块、全局变量不需要引入直接使用
        // 语法:process.cwd() 获取当前DOS窗口指定命令路径
        // 咱们:一般都是在项目根目录下执行
        path: path.resolve(process.cwd(), 'dist'),

        // 默认HTTP请求状态码:200  有请求 、有响应数据
        // 然后浏览器都有缓存机制:304 有请求、有响应【没】有数据  数据来源于浏览器缓存
        // 如果你看过我之前在课件中发的nginx里面有一个词:expires 、gzip  直接不发送请求
        // 缓存机制:文件名  用户第1次访问后根据文件名缓存,第2次就不发送请求
        // 问题:每次项目build上线文件名都一样
        // 你跟新、但是文件名都一样用户还是用的以前的js、css新功能没办法实现.
        // 解决:每次build之后都会产生一个新的文件名
        // filename: 'qf.js'                 // 单个
        // filename: '[name].js'             // 多个 
        // filename: '[name].[hash].js'      // 避免缓存 
        // filename: '[name].[hash:7].js'    // 截取指定 
        // filename: '[name].[chunkhash:7].js'  // 内容hash 
        filename: 'static/js/[name].[chunkhash:7].js'  // 内容hash 
        
        // 区别:hash每次都会有一个唯一的标识 只要内容变了 全部重新生成
        //      chunkhash基于每个文件的内容 修改了 只会这个文件重新生成
    },
    module: {
        rules: [
            {
                test: /\.css$/i,
                // use: ['style-loader', 'css-loader'],
                use: [MiniCssExtractPlugin.loader, 'css-loader'],
            },
        ],
    },
    plugins: [
        //说明:功能让webpack变得更强
        //作用:CSS单独文件存放
        new MiniCssExtractPlugin({
            // filename: '[name].css',
            filename: 'static/css/[name].css',
        }),
        //作用:给public/index.js自动引入打包后的js等文件
        //new HtmlWebpackPlugin()
        new HtmlWebpackPlugin({
            // 自定义变量
            title: "cyyWEBPACK脚手架",
            desc: "vixx",
            // 输出到dist下面的名称、默认index.html
            filename: 'index.html',
            // 模板文件
            template: 'public/index.html'
        })
    ]
};

■开发服务器配置

(webpack-dev-server)

内存 > 文件 > 数据库/文件

  • 发现:每次修改都需要重新打包
  • 解决:安装webapck-dev-server模块(1-提供web服务器,2-自动打包,3-内存)
  • 实现

1安装

yarn add webpack-dev-server --dev

2修改package.json文件增加开发服务器

"scripts": {
 "build": "webpack --mode=production --config scripts/webpack.config.js",
 "dev": "webpack-dev-server --mode=development --config scripts/webpack.config.js"
}

3修改webpack.config.js增加配置信息

//.......

module.exports = {
 devServer: {
   open: true,  // yarn 之后自动打开浏览器
   port: 3000   // 默认端口
 },
 //.......
};

■loaders配置

(css预处理、postcss处理css兼容)

明确需求

说明:在写项目时,我们需要使用css预处理sass/less等

思考:默认支持吗

回答:不支持,解决通过sass-loader

css预处理

  • 发现问题

步骤1:创建qf.scss文件

$color: green;
body { color: $color;}

步骤2:qf.js导入qf.scss文件

import './qf.css'
import './qf.scss'

console.log("hello,webopenfather 333")

步骤3:运行测试发现报错

  • 解决问题

步骤1:解决https://www.npmjs.com/package/sass-loader

yarn add sass-loader node-sass --dev
module: {
 rules: [
     {
         test: /\.css$/i,
         // use: ['style-loader', 'css-loader'],
         use: [MiniCssExtractPlugin.loader, 'css-loader'],
     },
     {
         test: /\.s[ac]ss$/i,
         // use: ['style-loader', 'css-loader', 'sass-loader',],
         use: [MiniCssExtractPlugin.loader, 'css-loader', 'sass-loader',],
     },
 ],
},

步骤5:修改index.html

<!DOCTYPE html>
<html>
<head>
 <meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
 <meta name="description" content="<%= htmlWebpackPlugin.options.desc %>">
 <title><%= htmlWebpackPlugin.options.title %></title>
</head>
<body>
 <div id="root">
   <h1>你好,世界</h1>
 </div>
</body>
</html>

postcss处理css兼容

  • 解决

通过postcss的autoprefixer插件,

写标准css后autoprefixer会自动帮你添加浏览器前缀的

步骤1:安装

yarn add postcss-loader autoprefixer --dev

步骤2:修改webpack.config.js

// ...

module.exports = {
    // ...
    module: {
      rules: [ 
        {
          test: /\.s[ac]ss$/i,
          use: [
          	MiniCssExtractPlugin.loader, 'css-loader',  'sass-loader', 
          	'postcss-loader'
          ],
        },
        {
          test: /\.css$/i,
          use: [
          	MiniCssExtractPlugin.loader, 'css-loader', 
          	'postcss-loader'
          ],
        },
      ],
    },
};

步骤3:创建postcss.config.js文件

module.exports = {
    plugins: [
        require('autoprefixer')
    ]
}

步骤4:修改css文件

::placeholder {
 color: gray;
}

步骤5:yarn build 查看效果

■loaders配置(图片等资源文件处理)

1、说明

思考:开发中需要打包图片等静态资源,如何实现呢

回答:通过file-loader、url-loader等

思考:如果不需要webpack打包呢

回答:通过copy-webpack-plugin模块

2、图片资源打包(file-loader)

步骤1:修改qf.scss

h1 {
    width: 255px;
    height: 255px;
    text-align: center;
    background: url(./assets/az.jpg)
}

步骤2:安装模块

yarn add file-loader --dev

步骤3:修改webapck.config.js配置文件

{
    test: /\.(png|jpe?g|gif)$/i,
    loader: 'file-loader',
    options: {
        name: 'static/images/[name].[ext]',
        publicPath: '/',
	},
},

步骤4:yarn dev 查看效果

3、图片打包优化(url-loader)

  • 说 明:部分体积小的图片可以通过base64图片编码优化,减少HTTP请求

  • 步骤1:安装模块 -> 配置

yarn add url-loader --dev
  • 步骤2:修改webpack.config.js配置文件
// url-loader含file-loader
// {
//   test: /\.(png|jpe?g|gif)$/i,
//   loader: 'file-loader',
//   options: {
//     name: 'static/images/[name].[ext]',
//     publicPath: '/',
//   },
// },
{
    test: /\.(png|jpg|gif)$/i,
    use: [
        {
            loader: 'url-loader',
            options: {
                limit: 15000, //图片超过指定字节不编码   1024*3
                name: 'static/images/[name].[ext]',
                publicPath: '/',
            },
        },
    ],
},

步骤3:运行【yarn dev】查看是否是base64编码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eSltNQwB-1598448775358)(images/1588836017016.png)]

4、静态资源拷贝(copy-webpack-plugin)

  • 说 明:在实际项目中也有部分资源不需要打包,思考如何解决

  • 回 答:通过copy-webpack-plugin模块

  • 步骤1:安装模块-配置

yarn add copy-webpack-plugin --dev
  • 步骤2:配置
const CopyPlugin = require('copy-webpack-plugin');

new CopyPlugin([
	{ 
        from: path.resolve(process.cwd(), 'src/static/css'), 
        to: path.resolve(process.cwd(), 'dist/static/css'), 
    },
    { 
        from: path.resolve(process.cwd(), 'src/static/js'), 
        to: path.resolve(process.cwd(), 'dist/static/js'), 
    }, 
    { 
        from: path.resolve(process.cwd(), 'src/static/images'), 
        to: path.resolve(process.cwd(), 'dist/static/images'), 
    },
]),
  • 步骤3:创建src\static\images目录放图片

  • 步骤4:测试 yarn build

■loaders配置(babel)

说明:在开发中经常会用到es6+语法

思考:如何保证兼容性呢

回答:通过babel-loader模块

------------------------------------------------------------

步骤1:打开qf.js输入下述代码

async function sayBy() {
  const result = await fetch('https://baidu.com')
  console.log(result)
}

sayBy()


之前:es5 ajax有异步回调地狱问题     		横向太深
因此:es6 promise就是解决异步回调地狱的      纵向太深
最后:es7 async await

步骤2:打包 -> 查看打包文件(是否存在es7语法)

yarn build

步骤3:安装babel-loader -> 配置 https://www.npmjs.com/package/babel-loader

yarn add babel-loader @babel/core @babel/preset-env
{
      test: /\.m?js$/,
      exclude: /(node_modules|bower_components)/,
      use: {
        loader: 'babel-loader',
        options: {
          presets: ['@babel/preset-env']
        }
      }
    }

步骤4:查看验证 yarn build


■快速生成react框架

步骤1:安装模块(刚才安装的所有模块

yarn add  @babel/core @babel/preset-env autoprefixer babel-loader copy-webpack-plugin css-loader file-loader html-webpack-plugin mini-css-extract-plugin node-sass postcss-loader sass-loader style-loader url-loader webpack webpack-cli webpack-dev-server --dev

步骤2:继续安装(需要js支持react安装的模块

yarn add react react-dom @babel/preset-react

步骤3:修改package.json

"scripts": {
    "build": "webpack --mode=production --config config/webpack.config.js",
    "dev": "webpack-dev-server --mode=development --config config/webpack.config.js"
  },

步骤4:创建config/webpack.config.js

const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const CopyPlugin = require('copy-webpack-plugin');

module.exports = {
    devServer: {
      open: true,
      port: 3000
    },
    // 入口文件
    entry: './src/index.js',
    // entry: './src/qf.js',
    // entry: {
    //   qf: './src/qf.js',
    //   about: './src/about.js',
    //   home: './src/home.js'
    // },
    output: {
      // path:输出目录
      // path.resolve 平台目录分隔符  win \  & linux/mac /
      // __dirname 当前文件所在目录
      // process.cwd() 获取当前命令所执行目录
      // path: __dirname + '/dist'
      // path: path.resolve(__dirname, 'dist'),
      path: path.resolve(process.cwd(), 'dist'),
      // filename: 'qf.js'      // 指定单文件
      // filename: '[name].js'  // 指定多文件
      // filename: '[name].[hash].js'  // 指定多文件,防缓存 304
      // filename: '[name].[hash:7].js'   // 指定长度
      filename: 'static/js/[name].[chunkhash:7].js'   // 内容生成的标识
    },
    module: {
      rules: [
        {
          test: /\.s[ac]ss$/i,
          // use: ['style-loader', 'css-loader', 'sass-loader'],
          use: [MiniCssExtractPlugin.loader, 'css-loader', 'sass-loader', "postcss-loader"],
        },
        {
          test: /\.css$/i,
          // use: ['style-loader', 'css-loader'],
          use: [MiniCssExtractPlugin.loader, 'css-loader', "postcss-loader"],
        },
        // {
        //   test: /\.(png|jpe?g|gif)$/i,
        //   loader: 'file-loader',
        //   options: {
        //     name: 'static/images/[name].[ext]',
        //     publicPath: '/',
        //   },
        // },
        		// url-loader含file-loader
        // {
        //   test: /\.(png|jpe?g|gif)$/i,
        //   loader: 'file-loader',
        //   options: {
        //     name: 'static/images/[name].[ext]',
        //     publicPath: '/',
        //   },
        // },
        {
          test: /\.(png|jpg|gif)$/i,
          use: [
              {
                  loader: 'url-loader',
                  options: {
                      limit: 15000, //图片超过指定字节不编码
                      name: 'static/images/[name].[ext]',
                      publicPath: '/',
                  },
              },
          ],
        },
        {
          test: /\.m?js$/,
          exclude: /(node_modules|bower_components)/,
          use: {
            loader: 'babel-loader',
            options: {
              presets: ['@babel/preset-env']
            }
          }
        }
      ],
    },
    plugins: [
      // new HtmlWebpackPlugin(), // Generates default index.html
      new HtmlWebpackPlugin({  // Also generate a test.html
        // filename: 'test.html',  输出文件名称,默认index.html

        template: 'public/index.html',
        title: 'cyyWEBPACK',
        desc: '你好世界'
      }),

      new MiniCssExtractPlugin({
        filename: 'static/css/[name].css'
      }),

      new CopyPlugin([
        { 
          from: path.resolve(process.cwd(), 'src/static/css'), 
          to: path.resolve(process.cwd(), 'dist/static/css'), 
        }, 
        { 
          from: path.resolve(process.cwd(), 'src/static/js'), 
          to: path.resolve(process.cwd(), 'dist/static/js'), 
        }, 
        { 
          from: path.resolve(process.cwd(), 'src/static/images'), 
          to: path.resolve(process.cwd(), 'dist/static/images'), 
        },
      ]),
    ]
};

步骤5:在src目录下创建

index.js

// 导入库
import React from 'react'
import {render} from 'react-dom'

// 导入组件
import App from './App'

// 渲染
render(<App />, document.querySelector('#root'))

App.js

import React, { Component } from 'react';

//import './App.scss'

class App extends Component {
    render() {
        return (
            <div>
                <h1>My React CLI 666</h1>
            </div>
        );
    }
}

export default App;

步骤6:创建public/index.html文件

<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
    <meta name="description" content="<%= htmlWebpackPlugin.options.desc %>">
    <title><%= htmlWebpackPlugin.options.title %></title>
  </head>
  <body>
    <div id="root"></div>
  </body>
</html>

步骤7:其他

项目根目录创建.babelrc(也就是src同级)

{ "presets":["@babel/react","@babel/env"]}

项目根目录创建postcss.config.js

module.exports = {
    plugins: [
      require('autoprefixer')
    ]
  }

步骤8:yarn dev测试

■面试题

webpack和gulp有什么区别

相同点:都是前端自动化构建工具
不同点:
1-gulp强调工作流程,
2-webpack前端模块化开发解决方案  强调模块化,压缩合并、预处理等,不过是它附带的功能
 

===================================================================
gulp强调工作流程,通过task方法设置一个个任务(例如文件压缩、合并、启动server等)
webpack是一个前端模块化方案,更侧重模块打包,我们可以把开发中的所有资源(图片、js文件、css文件等)都看成模块,
通过loader(加载器)和plugins(插件)对资源进行处理,打包成符合生产环境部署的前端资源。
总结区别
gulp模块化并没有强调,而是规范化前端开发流程
webpack更明显强调模块化开发,压缩合并、预处理等,不过是它附带的功能

webpack你做过哪些配置!!!

1.flexible实现rem自适应
2.配置css预处理(咱们写react项目的时候
3.解决跨域(咱们写react项目的时候你肯定配置跨域

https://www.webpackjs.com/configuration/dev-server/#devserver-proxy
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值