Webpack初始化&配置

初始化webpack项目
1. 在当前位置创建一个空目录  $ mkdir webpack-demo(目录名)
2. cd webpack-demo 目录,初始化一个package.json   $ npm init
3. 安装'webpack'与'webpack-cli' $ npm install webpack webpack-cli -D
4. 创建入口js文件与html文件,$ npm touch index.html src/index.js
5. 创建webpack.config.js文件 $ touch webpack.config.js

npx 执行依赖包里的二进制文件, 在 npm version >= 5.2.0 开始,默认安装了npx
如:可以直接通过npx webpack命令执行编译打包,
不需要用到./node_modules/.bin/webpack -v

// webpack.config.js 是webpack自身定义的默认配置文件名,会覆盖webpack的默认配置项
// webpack默认只能识别JS模块,其他模块是不识别的, loader就是帮助webpack来识别并解析除了JS的其他模块的, loader的配置主要在module.rules中进行
//loader的主要作用 1.识别文件类型,确定具体处理该模块的loader (rule.test) 2.使用对应的loader, 对文件进行相关操作转换 (rule.use)

const path = require('path')

const HtmlWebpackPlugin = require('html-webpack-plugin')
/**1.为html文件中引入的外部资源每次更新后的hash,防止引用缓存的外部文件问题 
 * 2.可以生成创建html入口文件,比如单页面会生成一个html文件入口,如果配置多个html-webpack-plugin即可生成多个页面入口**/

const { CleanWebpackPlugin } = require('clean-webpack-plugin') // 清理dist文件夹
const MiniCssExtractPlugin = require('mini-css-extract-plugin') // 将分离css插件,用于生产环境, 若开发环境用的话,就无法样式模块热更新
module.exports = {
    entry: {
        main: './src/index.js' //入口文件
    },
    output: { // 输出文件配置
        filename: 'bundle.js', // 输出文件名
        path: path.resolve(__dirname, 'dist') // output的path需要绝对路径,使用node.js的path模块来解析为绝对路径
    },
    mode: "development",
    devServer: {
        contentBase: './dist', // 启动的目录
        open: false, // 自动打开浏览器
        proxy: { // 设置代理,解决跨域请求问题
            "/api": {
                target: "http://127.0.0.1:5500"
            }
        },
        port: 8088, // 指定端口号
        hot: true, // 开启HMR(Hot Module Replacement) 热模块替换,由于是webpack自带的,所以要引入webpack, 监控并更新js模块的工作vue等框架自己做了,否则需要自己拖动监控
        // hotOnly: true 在某些模块不支持热更新的情况下,不会刷新页面,只在控制台输出热更新失败
        before(app, server, compiler) { // 当html发生改变时,重新加载页面
            const watchFiles = ['.html'];
            compiler.hooks.done.tap('done', () => {
                const changedFiles = Object.keys(compiler.watchFileSystem.watcher.mtimes);
                if (
                    this.hot &&
                    changedFiles.some(filePath => watchFiles.includes(path.parse(filePath).ext))
                 ) {
                    server.sockWrite(server.sockets, 'content-changed');
                 }
            })
        }
    },

    // 非js模块的配置
    module: {
        rules: [
            {
                test: /\.(jpe?g|png|git)$/,
                use: {
                    loader: "url-loader",
                    options: {
                        name: "[name]-[hash:7].[ext]", // []表示占位符(placeholder),name表示源文件的名字,ext是源文件的后缀,还可以连接hash: [name]-[hash].[ext]
                        outputPath: "images", // 输出的图片文件夹
                        limit: 10000 // 限制当图片小于10000以下,将图片转化为base64
                    }
                }
            },
            {
                test: /\.css$/,
                use: [
                    // 执行顺序:由下至上,由右至左
                    'style-loader', // 把合并后的css直接放在页面的style样式上
                    // {
                    //     loader: MiniCssExtractPlugin.loader
                    // }, // 将css分离出来
                    'css-loader' // 合并css
                ]
            },
            {
                test: /\.scss$/,
                use: [
                    'style-loader',
                    // {
                    //     loader: MiniCssExtractPlugin.loader
                    // }, // 将css分离出来
                    'css-loader',
                    'sass-loader', // 将sass转化为css,依赖node-sass模块(npm i sass-loader node-sass -D)
                    'postcss-loader' // 自动添加需要前缀的样式, 还需安装autoprefixer依赖包
                ]
            }
        ]
    },
    // plugins,是用于扩展webpack的功能,本身是一个类,通过在构造函数中传入不同参数实现不同功能, 数组里面的项即是插件的实例
    plugins: [
        // 执行顺序由上至下
        new CleanWebpackPlugin({
            cleanOnceBeforeBuildPatterns: [path.join(__dirname, "dist")]
        }),
        
        new HtmlWebpackPlugin({ // 自动生成html并打包至输出的目录中
            title: 'html模板',
            filename: 'index.html',
            template: "./index.html"
        }),
        new MiniCssExtractPlugin({ // 将css分离出来
            filename: '[name].css',        // 输出文件名 
            chunkFilename: '[id].css',            // 模块名
        })
    ],
    devtool: 'cheap-module-eval-source-map' // 用于开发环境,打包后的文件与源码的映射文件,打包后在dist文件夹中会多出后缀为map的映射文件,方便定位到具体错误所在,解决问题,
}
// 使用postcss-loader需要在根目录添加一个文件 $mkdir postcss.config.js
module.exports = {
    plugins: [
        require('autoprefixer')
    ]
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353

推荐阅读更多精彩内容