webpack4学习系列(二):入门

一、entry

单页应用程序的入口配置一般如下所示:

entry: __dirname + "/src/category/demo1/demo1.js"

这个配置就是指定 webpack从 /src/category/demo1/demo1.js这个文件开始进入,进行一系列的打包编译过程。
多入口文件的entry配置是对象的形式

entry: {
        demo1:__dirname + "/src/category/demo1/demo1.js",
        demo2:__dirname + "/src/category/demo2/demo2.js"
    }

二、output

output: {
        libraryTarget: 'umd',
        path:__dirname +'/dist/',//打包后的文件存放的地方
        filename: "[name].js"//打包后输出文件的文件名
    }

三、使用webpack-dev-server构建本地服务器

效果:浏览器监听你的代码的变更,并自动刷新显示修改后的结果

npm install --save-dev webpack-dev-server

配置文件 webpack.config.js 配置如下

module.exports={
    devtool: 'eval-source-map',
    entry: __dirname + "/src/category/demo2/pdf.js",
    output: {
        libraryTarget: 'umd',
        path:__dirname +'/dist/',
        filename: "[name].js"
    },
    devServer: {
        contentBase: "./src",//本地服务器所加载的页面所在的目录
        port:"8080",//设置监听端口
        historyApiFallback: true,//不跳转
        inline: true//源文件变更时,实时刷新
    }
};

在package.json中的scripts对象中添加如下命令,用以开启本地服务器和webpack打包:

"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "webpack", //打包命令
    "server": "webpack-dev-server --open" //开启本地服务
  }

四、Loaders

Loaders是webpack提供的最激动人心的功能之一了。通过使用不同的loader,webpack有能力调用外部的脚本或工具,实现对不同格式的文件的处理,比如说分析转换scss为css,或者把下一代的JS文件(ES6,ES7)转换为现代浏览器兼容的JS文件,对React的开发而言,合适的Loaders可以把React的中用到的JSX文件转换为JS文件。

Loaders需要单独安装并且需要在webpack.config.js中的modules关键字下进行配置

1、babel解析
安装依赖

"devDependencies": {
    "@babel/core": "^7.3.4", //核心功能模块
    "@babel/plugin-transform-runtime": "^7.3.4",
    "@babel/preset-env": "^7.3.4", //解析Es6
    "@babel/preset-react": "^7.0.0", //解析JSX
    "babel-loader": "^8.0.5"
  }

webpack.config.js中的配置如下:

module: {
        rules: [
            {
                test:/(\.jsx|\.js)$/,
                use:{loader:"babel-loader"},
                exclude:/node_modules/
            }
        ]
    }

Babel其实可以完全在 webpack.config.js 中进行配置,但是考虑到babel具有非常多的配置选项,在单一的webpack.config.js文件中进行配置往往使得这个文件显得太复杂,因此一些开发者支持把babel的配置选项放在一个单独的名为 ".babelrc" 的配置文件中。
例如在.babelrc中做如下配置:

{
  "presets":["es2015","react","stage-1"],
  "plugins": [["import", {
      "libraryName": "cheui-react",
      "libraryDirectory": "lib/components",
      "camel2DashComponentName": true 
  }]]
}

2、css文件解析
webpack提供两个工具处理样式表,css-loader 和 style-loader,二者处理的任务不同,css-loader使你能够使用类似@import 和 url(...)的方法实现 require()的功能,style-loader将所有的计算后的样式加入页面中,二者组合在一起使你能够把样式表嵌入webpack打包后的JS文件中。

module: {
        rules: [
            {
                test: /\.css$/,
                use: [
                    {
                        loader: "style-loader"
                    }, {
                        loader: "css-loader",
                        options:{
                              modules:true, //指定启用css modules
                              localIdentName: '[name]__[local]--[hash:base64:5]'// 指定css的类名格式
                          }
                    }
                ]
            }
        ]
    }

Webpack对CSS模块化提供了非常好的支持,只需要在CSS loader中进行简单配置即可,然后就可以直接把CSS的类名传递到组件的代码中,这样做有效避免了全局污染

3、CSS预处理器
处理less需要依赖less-loader
处理scss需要依赖sass-loader,其中sass-loader依赖于node-sass
通过上述预处理器可以将less、scss这些特殊类型的语句转化为浏览器可识别的CSS语句

4、css文件单独打包
webpack版本 < 4 时 通过extract-text-webpack-plugin插件
webpack版本 = 4 时 通过mini-css-extract-plugin插件

注意extract-text-webpack-plugin next版本 也可以支持webpack4

npm install --save-dev extract-text-webpack-plugin@next

5、添加CSS3前缀

npm install autoprefixer postcss postcss-loader  postcss-sprites

webpack.config.js 解决上述3、4、5需求的配置如下:

module: {
        rules: [
            {
                test:/\.(le|c|sc)ss$/,
                use:[
                    { loader: MiniCssExtractPlugin.loader },
                    {loader: "css-loader"},
                    {
                        loader: "postcss-loader",
                        options: {
                            ident:'postcss',
                            plugins: [
                                require("autoprefixer")({
                                    browsers:'last 100 versions'
                                })
                            ]
                        }
                    },
                    {loader: "less-loader"},
                    {loader: "sass-loader"}
                ]
            }
        ]
    },
plugins: [
        new MiniCssExtractPlugin({
            filename: '[name].css'
        })
    ]

6、图片处理
前端项目中除了html、css、js,不可避免地要处理图片文件,webpack打包图片文件是通过file-loader、url-loader、img-loader、html-loader处理的。

file-loader :对文件进行处理 (如:打包图片文件等)
url-loader : url-loader中内置了 file-loader,url-loader可以将指定大小及以下的图片文件转成base64写入js,避免额外请求图片资源,如果超过指定大小再使用file-loader打包图片文件。
img-loader: 作用是对图片进行压缩

常用的三种加载图片的方式:

css中引入

.car1{
  background: url('./assets/img/gongchengc_icon@2x.png')
}
.car2{
  background: url('./assets/img/huochec_icon@2x.png')
}
.car3{
  background: url('./assets/img/kechec_icon@2x.png')
}

js引入

let imgSrc = require('./assets/img/huochec_icon@2x.png');
class Home extends Component{
    render() {
        return (
            <div onClick={()=>{console.log('1')}} className="root">
                测试内容xia
                <div className="test">
                    测试内容xia1
                </div>
                <img src={imgSrc} alt=""/>
                <Test/>
            </div>
        )}
}

这两种 使用 file-loader 或 url-loader可以解决

html中引入

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Webpack Sample Project</title>
</head>
<body>
<div id='root'>
</div>
<img src="./category/demo2/assets/img/u175.png"/>
</body>
</html>

要处理html中的图片,需要使用其html-loader,具体配置如下:

module: {
        rules: [
            {
                test:/\.(png|jpg|gif|jpeg)$/,
                use:[
                    {
                        loader:'url-loader',
                        options:{
                            name:'[name].[ext]',  //图片打包后文件名
                            outputPath:'images',  //图片打包后存放的目录
                            limit:1000,  //小于1000字节的图片自动转成base64格式,且不会存在实体图片
                            publicPath: current_env === "development" ? "" :"https://img.58cdn.con.cn/img/"
                        }
                    },
                   {
                        loader:'img-loader',
                        options:{
                            pngquant:{
                                quality:80
                            }
                        }
                   }
                ]
            },
            {
                test: /\.html$/,
                use: {
                    loader: 'html-loader'
                }
            }
        ]
    },

五、插件(Plugins)

插件(Plugins)是用来拓展Webpack功能的,它们会在整个构建过程中生效,执行相关的任务。
Loaders和Plugins常常被弄混,但是他们其实是完全不同的东西,可以这么来说,loaders是在打包构建过程中用来处理源文件的(JSX,scss,less..),一次处理一个,插件并不直接操作单个文件,它直接对整个构建过程其作用。
Webpack有很多内置插件,同时也有很多第三方插件,可以让我们完成更加丰富的功能。

要使用某个插件,我们需要通过npm安装它,然后要做的就是在webpack配置中的plugins关键字部分添加该插件的一个实例

1、给打包后代码 添加版权声明的插件

plugins: [
        new webpack.BannerPlugin('版权所有,翻版必究')
         ]

2、html-webpack-plugin
这个插件的作用是依据一个简单的index.html模板,生成一个自动引用你打包后的JS文件的新index.html。这在每次生成的js文件名称不同时非常有用(比如添加了hash值)。

npm install --save-dev html-webpack-plugin

在src目录下,创建一个index.html文件模板,这个模板包含title等必须元素,在编译过程中,插件会依据此模板生成最终的html页面,会自动添加所依赖的 css, js,favicon等文件

更新webpack的配置文件

plugins: [
        new HtmlWebpackPlugin({
            template:__dirname + "/src/index.html"})
    ]
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容