webpack 4.0 学习笔记(一)

1.webpack可以做哪些事儿

  代码的转换,文件的优化,代码的分割,模块的合并,代码的校验,自动更新,自动发布,等等。

2.安装webpack

 npm init  新建项目

 npm install webpack webpack-cli -D  

 

3.简单配置,运行webpack,查看打包是否正确

const path = require('path');

module.exports = {
    mode: 'development', // 模式 默认两种 production 生产 development 开发
    entry: './src/index.js', // 入口文件
    output: {
        path: path.resolve(__dirname, 'dist'), // 打包后输出文件,在当前目录下新建一个dist 文件夹 必须是绝对路劲
        filename: 'index.js' // 打包后的文件夹
    }
}

 package.json

{
  "name": "weppack-dome",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo "Error: no test specified" && exit 1",
    "build": "webpack --config webpack.config.js" // --config 添加参数,运行哪个文件下的配置
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "webpack": "^4.34.0",
    "webpack-cli": "^3.3.4"
  }
}

运行 npm run build

4.使用webpack-dev-server 构建一个简单的web服务器,能实现修改代码后自动刷新

   npm i webpack-dev-server -D

  package.json

"scripts": {
    "test": "echo "Error: no test specified" && exit 1",
    "build": "webpack --config webpack.config.js",
    "dev": "webpack-dev-server --open" // 添加启动服务的命令 --open 自动打开浏览器
  },

测试用在dist文件夹新建index.html 文件  引入打包之后的index.js 查看8080窗口是否能正常启动,并弹出helloworld 和 hello webpack  

运行 npm run build (先打包) 在启动服务 npm run dev  能出现以下页面

在测试阶段dist内要提前新建好index.html文件 用于引入我们build之后的js,实际项目中不会这么做,下面来解决这个问题

5.使用 HtmlWebpackPlugin 插件来解决问题

  简化了每次创建html,会随着编译而变化的html

  npm i html-webpack-plugin -D 安装插件

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
    mode: 'production', // 模式 默认两种 production 生产 development 开发
    entry: './src/index.js', // 入口文件
    output: {
        path: path.resolve(__dirname, 'dist'), // 打包后输出文件,在当前目录下新建一个dist 文件夹 必须是绝对路劲
        filename: 'index.[hash:8].js' // 打包后的文件夹 添加8位的
    },
    devServer: { // web开发服务器的配置
        port: 8080, // 指定开启的端口
        progress: true, // 展示进度条
        contentBase: path.resolve(__dirname, 'dist'), //默认是以当前目录下开启静态服务,指定开启服务的文件夹
    },
    plugins: [ // 数组 放置插件
        new HtmlWebpackPlugin({
            hash: true, // 添加hash值
            template: path.resolve(__dirname, 'src/index.html'), // 模板的位置
            filename: 'index.html', // 输出文件名
            title: 'webpack-dome', // 生成HTML的标题
            minify: { // 代码压缩配置
                removeAttributeQuotes: true, // 把html 文件双引号去掉
                collapseWhitespace: true, // html文件引用的js添加hash值
            }
        })
    ]
}

6.添加css-loader

   npm i style-loader csss-loader -D

  

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
    mode: 'production', // 模式 默认两种 production 生产 development 开发
    entry: './src/index.js', // 入口文件
    output: {
        path: path.resolve(__dirname, 'dist'), // 打包后输出文件,在当前目录下新建一个dist 文件夹 必须是绝对路劲
        filename: 'index.[hash:8].js' // 打包后的文件夹 添加8位的
    },
    devServer: { // web开发服务器的配置
        port: 8080, // 指定开启的端口
        progress: true, // 展示进度条
        contentBase: path.resolve(__dirname, 'dist'), //默认是以当前目录下开启静态服务,指定开启服务的文件夹
    },
    module: { //模块
        rules: [ // 规则
            {
                test: /.css$|.styl$/,
                use: [ // 多个loader用数组,按顺序执行,配置单个loader用对象
                    {
                        loader: 'style-loader'  // 把css文件插入到head的标签中
                    },
                    'css-loader', // 解析@import 语法,把css 文件中引入css的文件
                ]
            }
        ]
    },
    plugins: [ // 数组 放置插件
        new HtmlWebpackPlugin({
            hash: true, // 添加hash值
            template: path.resolve(__dirname, 'src/index.html'), // 模板的位置
            filename: 'index.html', // 输出文件名
            title: 'webpack-dome', // 生成HTML的标题
            minify: { // 代码压缩配置
                removeAttributeQuotes: true, // 把html 文件双引号去掉
                collapseWhitespace: true, // html文件引用的js添加hash值
            }
        })
    ]
}

 

成功耶,更改配置文件要重新启动服务!有时候要自己更改css样式,会直接写一个标签,但是自己写的标签层级会比引入的低

在webpack.config.js 内更改配置

use: [ // 多个loader用数组,按顺序执行,配置单个loader用对象
                    {
                        loader: 'style-loader',  // 把css文件插入到head的标签中
                        options: {
                            insertAt: 'top' // 添加的位置在上面,方便自定义其他的css 样式
                        }
                    },
                    'css-loader', // 解析@import 语法,把css 文件中引入css的文件
                ]

成功 yep!

7.安装stylus loader 

 npm i stylus stylus-loader -D

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
    mode: 'production', // 模式 默认两种 production 生产 development 开发
    entry: './src/index.js', // 入口文件
    output: {
        path: path.resolve(__dirname, 'dist'), // 打包后输出文件,在当前目录下新建一个dist 文件夹 必须是绝对路劲
        filename: 'index.[hash:8].js' // 打包后的文件夹 添加8位的
    },
    devServer: { // web开发服务器的配置
        port: 8080, // 指定开启的端口
        progress: true, // 展示进度条
        contentBase: path.resolve(__dirname, 'dist'), //默认是以当前目录下开启静态服务,指定开启服务的文件夹
    },
    module: { //模块
        rules: [ // 规则
            {
                test: /.css$/,
                use: [ // 多个loader用数组,按顺序执行,配置单个loader用对象
                    {
                        loader: 'style-loader',  // 把css文件插入到head的标签中
                        options: {
                            insertAt: 'top' // 添加的位置在上面,方便自定义其他的css 样式
                        }
                    },
                    'css-loader', // 解析@import 语法,把css 文件中引入css的文件
                ]
            },
            {
                test: /.styl$/,
                use: [ // 多个loader用数组,按顺序执行,配置单个loader用对象
                    {
                        loader: 'style-loader',  // 把css文件插入到head的标签中
                        options: {
                            insertAt: 'top' // 添加的位置在上面,方便自定义其他的css 样式
                        }
                    },
                    'css-loader', // 解析@import 语法,把css 文件中引入css的文件
                    'stylus-loader' // 解析 stylus语法
                ]
            }
        ]
    },
    plugins: [ // 数组 放置插件
        new HtmlWebpackPlugin({
            hash: true, // 添加hash值
            template: path.resolve(__dirname, 'src/index.html'), // 模板的位置
            filename: 'index.html', // 输出文件名
            title: 'webpack-dome', // 生成HTML的标题
            minify: { // 代码压缩配置
                removeAttributeQuotes: true, // 把html 文件双引号去掉
                collapseWhitespace: true, // html文件引用的js添加hash值
            }
        })
    ]
}

新建styl文件 里面写css样式 在index.js 引入

 页面会出现一个宽和高都为500的盒子 并且居中哦!

8.安装插件 把css样式抽离出去

现在都是混合写在style标签内 ,抽离成外链式的

 npm i mini-css-extract-plugin -D

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const  MiniCssExtractPlugin = require('mini-css-extract-plugin');
const {CleanWebpackPlugin} = require('clean-webpack-plugin');

module.exports = {
    mode: 'production', // 模式 默认两种 production 生产 development 开发
    entry: './src/index.js', // 入口文件
    output: {
        path: path.resolve(__dirname, 'dist'), // 打包后输出文件,在当前目录下新建一个dist 文件夹 必须是绝对路劲
        filename: 'index.[hash:8].js' // 打包后的文件夹 添加8位的
    },
    // devServer: { // web开发服务器的配置
    //     port: 8080, // 指定开启的端口
    //     progress: true, // 展示进度条
    //     contentBase: path.resolve(__dirname, 'dist'), //默认是以当前目录下开启静态服务,指定开启服务的文件夹
    // },
    module: { //模块
        rules: [ // 规则
            {
                test: /.css$/,
                use: [ // 多个loader用数组,按顺序执行,配置单个loader用对象
                    // {
                    //     loader: 'style-loader',  // 把css文件插入到head的标签中
                    //     options: {
                    //         insertAt: 'top' // 添加的位置在上面,方便自定义其他的css 样式
                    //     }
                    // },
                    MiniCssExtractPlugin.loader,
                    'css-loader', // 解析@import 语法,把css 文件中引入css的文件
                ]
            },
            {
                test: /.styl$/,
                use: [ // 多个loader用数组,按顺序执行,配置单个loader用对象
                    // {
                    //     loader: MiniCssExtractPlugin.loader,  // 把css文件插入到head的标签中
                    //     options: {
                    //         insertAt: 'top' // 添加的位置在上面,方便自定义其他的css 样式
                    //     }
                    // },
                    MiniCssExtractPlugin.loader,
                    'css-loader', // 解析@import 语法,把css 文件中引入css的文件
                    'stylus-loader' // 解析 stylus语法
                ]
            }
        ]
    },
    plugins: [ // 数组 放置插件
        new HtmlWebpackPlugin({
            hash: true, // 添加hash值
            template: path.resolve(__dirname, 'src/index.html'), // 模板的位置
            filename: 'index.html', // 输出文件名
            title: 'webpack-dome', // 生成HTML的标题
            // minify: { // 代码压缩配置
            //     removeAttributeQuotes: true, // 把html 文件双引号去掉
            //     collapseWhitespace: true, // html文件引用的js添加hash值
            // }
        }),
        new MiniCssExtractPlugin({
            filename: 'main.css'
        }),
        new CleanWebpackPlugin() // 清楚打包文件下的内容
    ]
}

9.安装添加浏览器前缀

  npm i postcss-loader autoprefixer -D

rules: [ // 规则
            {
                test: /.css$/,
                use: [ // 多个loader用数组,按顺序执行,配置单个loader用对象
                    MiniCssExtractPlugin.loader,
                    'css-loader', // 解析@import 语法,把css 文件中引入css的文件
                    {    //浏览器兼容
                        loader: 'postcss-loader',
                        options: {
                            plugins: [
                                require('autoprefixer') /*在这里添加*/
                            ]
                        }
                    }
                ]
            },

 10.添加css 压缩

  npm install mini-css-extract-plugin optimize-css-assets-webpack-plugin terser-webpack-plugin -D

  在webpack.config.js 引入

optimization: {
        minimizer: [
            new TerserJSPlugin({}), // 压缩js
            new OptimizeCSSAssetsPlugin({}) // 压缩css
        ]
    },

11.添加babel转换js

  npm install babel-plugin-dynamic-import-webpack  babel-loader @babel/core @babel/preset-env -D

  

rules: [ // 规则
            {
                test: /.js$/,
                use: [
                    {
                        loader: 'babel-loader',
                        options: {
                            presets: ['@babel/preset-env']
                        }
                    }
                ]
            },
      ....  
]    

在改项目根目录添加 .babelrc //解决import语法不能识别问题

原文地址:https://www.cnblogs.com/xiaxuening/p/11047743.html