webpack5搭建

从0搭建webpack5

思考:整个流程,首先想到项目整体会涉及到的技术,例如一个vue项目,首先.vue文件.scss .css .js .jsx .ts 登录

1.那么第一步npm init -y ,安装webpack

    yarn add webpack webpack-cli ,安装完毕后,新建webpack.config.js 文件

2. 新建项目

   新建src目录,并新增main.js App.vue ,在main.js 中引入app.vue 文件

import Vue from 'vue'
import App from './app.vue'

const root = document.createElement('div')
document.body.appendChild(root)

new Vue({
    render: (h) => h(App)
}).$mount(root)

3. 由于webpack本身不能识别js以外的文件,所以需要各种loader

    yarn add  vue

    yarn add -D vue-loader vue-style-loader vue-template-compiler

    yarn add scss sass-loader dart-loader css-loader style-loader -D

    yarn add url-loader file-loader -D (webpack5已经出了新的替代方式,type:'asset'/type:'asset/resource'等,详细查官网文档)

    yarn add webpack-dev-server -D 开发环境服务器

     yarn add cross-env -D 用于配置package.json script脚本 ,"dev": "cross-env NODE_ENV=development webpack serve --hot --config webpack.config.js" ,这样在webpack.config.js 文件里才可以取到process.env 数据,来判断是开发还是生产环境

    yarn add html-webpack-plugin  -D 自动生成html文件

     yarn add -D babel-loader @babel/core @babel/preset-env -D  babel 相关的

     yarn add postcss postcss-loader postcss-preset-env -D 可以直接在webpack.config.js文件配置postcss-loader 的postcssOptions ,也可以新建postcss.config.js文件,放入配置项,详细查阅文档,主要是为了处理css前缀兼容等

      yarn add -D webpack-merge

    常用 plugins:

            new webpack.optimize.CommonsChunkPlugin(options); 将公共模块与捆绑软件分开,可以将生成的分块文件最初加载一次,用于打包时的配置

const path = require('path')
const webpack = require('webpack')
// webpack.config.js webpack 5 以后配置,必须要配置VueLoaderPlugin
const VueLoaderPlugin = require('vue-loader/lib/plugin')
var MiniCssExtractPlugin = require('mini-css-extract-plugin') // 提取css到单独文件
const HtmlWebpackPlugin = require('html-webpack-plugin') // 生成html文件


let isDev = process.env.NODE_ENV === 'development'

const config = {
    mode: process.env.NODE_ENV,
    entry: path.join(__dirname, './src/main.js'),
    output: {
        publicPath: '/',
        path: path.join(__dirname, 'dist'),
        filename: "bundle.[hash].js",
        clean: true
    },
    devServer: {
        contentBase: './dist',
        hot: true, // 热加载
        port: '9900',
        host: '0.0.0.0',
        // 出现编译器错误或警告时,在浏览器中显示全屏覆盖
        overlay: {
            warnings: true,
            errors: true
        },
        open: false
    },
    resolve: {
       alias: {
          // 指定vue加载的文件,加载这个可以在js里写vue的template
          vue:path.resolve(__dirname,'../node_modules/vue/dist/vue.esm.js'),
          Templates: path.resolve(__dirname, 'src/templates/')
       },
    },
    module: {
        rules: [
            {
                test: /\.vue$/,
                use: [{
                    loader: 'vue-loader'
                }],
                exclude: /node_modules/,
                include: path.join(__dirname, 'src')
            },
            {
                test: /\.jsx$/,
                use: ['babel-loader']
            },
            {
                test: /\.s[ac]ss$/,
                use: [
                    // 将 JS 字符串生成为 style 节点
                    "style-loader",
                    // 将 CSS 转化成 CommonJS 模块
                    "css-loader",
                    {
                        loader: 'postcss-loader',
                        options: {
                            sourceMap: true,
                        }
                    },
                    // 将 Sass 编译成 CSS
                    "sass-loader",
                ],
            },
            {
                test: /\.css$/,
                use: [
                    isDev ? 'vue-style-loader'
                        : MiniCssExtractPlugin.loader,
                    'css-loader'
                ]
            },
            {
                test: /\.(png|svg|jpg|jpeg|gif)$/i,
                type: 'asset' // webpack5 新增加的内置解析,之前用url-loader file-loader
            },
            {
                test: /\.(woff|woff2|eot|ttf|otf)$/i,
                type: 'asset/resource',
            }
        ]
    },
    devtool:'eval-cheap-module-source-map'
    plugins: [
       // 热模块重载
        new webpack.HotModuleReplacementPlugin({}),
        //没有错误输出插件
        new webpack.NoEmitOnErrorsPlugin()
        // 这个设置是为了在项目代码中也能使用process.env.NODE_ENV,根据获取的环境判断相应的数
        // 允许你创建可在编译时配置的全局常量
        new webpack.DefinePlugin({
            'process.env': {
                NODE_ENV: isDev ? '"development"' : '"production"'
            }
        }),
        // 生成html
        new HtmlWebpackPlugin({
            template:path.resolve(__dirname,'template的模板地址,在public里新建index.html')
            minify: {
                // 移除空格
                collapseWhitespace: true,
                // 移除注释
                removeComments: true
            }
        }),
        // webpack5 必须要使用的插件
        new VueLoaderPlugin()
    ]
}

module.exports = config

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值