美文网首页
webpack随笔纪要

webpack随笔纪要

作者: 孩纸是坏孩纸 | 来源:发表于2018-12-12 00:53 被阅读0次

    webpack安装前提条件:

    安装node.js环境

    webpack安装过程:

    npm install -g webpack  安装webpack到全局环境中(缺点:webpack官方不建议安装到全局,这样会影响项目,如果之前的项目使用的是webpack低版本,那会导致低版本使用了安装在全局环境中的webpack版本)

    webpack安装到局部环境(注意:项目目录名称不能是webpack关键字)

    1.cd 进入项目目录

    2.npm init(初始化环境,默认需要填写一堆基本信息)

    3.npm install --save-dev webpack(使用--save-dev是开发环境,如果需要使用生产环境则直接使用--save)

    webpack打包项目过程(以下目录都要有的目录)

    1.dist(用于生产环境,也就是打包后的文件目录)

    2.src(用户开发环境,也就是书写的代码都放在此目录下)

    3.在dist目录下新建一个index.html文件并在里面书写html代码,同时在结尾加上一段<script src="./bundle.js"></script>

    4.在src目录下新建一个entery.js并写入document.getElementById("title").innerHTML = "Hello World";  (其中entery.js为入口文件)

    5.命令行使用webpack src/entery.js dist/bundle.js  (解析:webpack 要打包的文件  打包后的目标文件,webpack最新版需要使用webpack -o 要打包的文件  打包后的目标文件)

    6.安装live-server(nmp install -g live-server)

    7.运行live-server会打开浏览器进行预览

    △真正项目上不是上面这样用,上面是简单的做一下打包,下面是在项目中会用到的方式进行打包的过程

    注意:要使用webpack.conf.js配置文件,需要在package.js中的scripts选项加入"build": "webpack --config webpack.conf.js",然后直接使用npm run build即可进行打包

    1.在项目根目录下新建webpack.conf.js,该文件里的内容:

    //引入node的path模块

    const path=require("path");

    module.exports={

        //入口配置项

        entry:{

            //入口文件路径

            index1:path.join(__dirname, "./src/index1.js"),

            index2:path.join(__dirname, "./src/index2.js"),

        },

        //出口配置项

        output:{

            //输入的目标路径

            filename: "[name].bundle.js",

            path:path.resolve(__dirname, "dist")

        },

        //模块配置项

        module:{},

        //插件配置项

        plugins:[],

        //webpack开发服务项

        devServer:{}

    }

    △webpack的热更新

    1.在webpack.conf.js的devServer中加入以下参数:

    devServer:{

        //需要热更新的目录路径

        contentBase:path.resolve(__dirname, "dist"),

        //热更新访问地址

        host:"192.168.3.10",

        //热更新端口

        port:1717,

        //热更新是否压缩(服务器端)

        compress:true

    }

    2.使用热更新需要环境中安装webpack-dev-server服务,如果该服务需要安装到当前项目中,直接使用nmp install webpack-dev-server --save-dev(开发环境,--save安装到上线环境),

    安装完成之后,需要在目录中的package.json中的scripts选项中配置一个别名

    "dev": "webpack-dev-server --config webpack.conf.js"

    3.运行npm run dev,

    如果不这样配置会报错,说找不到入口(完成后,直接访问http://192.168.3.10:1717即可,就可以完成热更新操作)

    △打包CSS3文件

    1.打包css文件需要安装style-loader、css-loader模块(执行npm install style-loader --save-dev、npm install css-loader --save-dev)

    2.在入口文件所在目录中新建css文件夹并在该文件夹中新建样式文件,然后在入口js文件中使用import css from 路径(该路径必须为相对路径)

    3.在webpack.conf.js文件的modules选项中配置如下参数:

    rules:[

                {

                    //正则表达式,匹配对应后缀名的文件

                    test:/\.css$/,

                    //使用什么loader模块进行打包

                    use:['style-loader', 'css-loader']

                }

            ]

    例外两种写法:

    rules:[

                {

                    //正则表达式,匹配对应后缀名的文件

                    test:/\.css$/,

                    //使用什么loader模块进行打包

                    loader:['style-loader', 'css-loader']

                }

            ]

    rules:[

                {

                    //正则表达式,匹配对应后缀名的文件

                    test:/\.css$/,

                    //使用什么loader模块进行打包

                    loader:[{

                        loader:"style-loader"

                    },{

                        loader:"css-loader"

                    }]

                }

            ]

    △打包压缩js文件

    1.执行npm install uglifyjs-webpack-plugin --save-dev进行安装并保存到package.json中

    2.在webpack.conf.js顶部中引入:

    const uglify = require("uglifyjs-webpack-plugin");

    3.plugins中写上new uglify();

    4.执行打包指令进行打包

    △打包html文件

    1.执行npm install html-webpack-plugin --save-dev

    2.在webpack.conf.js中引入const htmlPlugin = require('html-webpack-plugin');

    3.将原来在dist目录下的index.html剪切到src目录下并将index.html文件中引入的js文件去掉(因为打包出来的文件webpack会自动引入js文件,无须我们手动添加)

    4.在webpack.conf.js中的plugins属性中输入如下:

    new htmlPlugin({

        minify:{

            //去掉html文件中引号(单引号、双引号都会去除)

            removeAttrubuteQuotes:true

        },

        //防止js文件有缓存,所以会在js文件后加入?hash值(热更新的时候hash值会改变)

        hash:true,

        //需要打包的html文件

        template:"./src/index.html"

    });

    △CSS文件中的图片处理

    1.执行npm install file-loader url-loader --save-dev , (这两个是解析图片用的loader,这两个loader只需要引入url-loader即可,以为url-loader里已经包含了file-loader,他们之间会自动转换)

    2.在webpack.conf.js中module中添加(如果图片小于limit的大小会把图片转成base64的格式打包进js中,如果大于limit会直接把图片放入dist目录中,outputPath指的是超出limit大小会把图片放到该目录下,并将该路径打包到js文件中):

    module:{

        rules:[{

            test:/\.(png|jpg|gif)$/,

            use:[{

                loader:"url-loader",

                options:{

                    limit:500000,

                    outputPath:'images/'

                }

            }]

        }]

    }

    3:在src下新建一个images文件夹,并把背景图片bg.jpg放入该文件夹中

    4:在src/css/style.css文件中设置一个背景图片:

    body{

        background:url(../images/bg.jpg) no-repeat;

    }

    5.运行live-server查看结果

    △解决图片路径问题

    1.运行npm install extract-text-webpack-plugin --save-dev

    2.定义const extractTextPlugin = require("extract-text-webpack-plugin");

    3.在webpack.conf.js定义一个变量(这里的地址需要定义成devServer上的地址和端口)

    var websit = {

        publicPath:"http://127.0.0.1:8080"

    };

    4.在webpack.conf.js中出口文件配置output选项中加入:

    publicPath:website.publicPath

    4.webpack.conf.js中将module中的值:

    rules:[

        {

            test:/\.css$/,

            use: extractTextPlugin.extract({

                fallback: "style-loader",

                use: "css-loader"

                })

        }

    ]

    5.webpack.conf.js中plugins的值增加(意思就是将抽离出来的css文件放入dist目录下的css文件夹中):

    new extractTextPlugin("css/style.css")

    4.然后打包,会发现打包出来的index.html中的路径会变成绝对路径

    注意:安装extract-text-webpack-plugin,如果webpack版本小于4.0可以直接使用npm install extract-text-webpack-plugin --save-dev进行安装,

    如果是webpack4.0之后的版本需要使用npm install extract-text-webpack-plugin@next --save-dev进行安装即可

    △解决html图片的问题

    1.运行npm install html-withimg-loader --save-dev

    2.在webpack.conf.js中的module加入:

    {

        test: /\.(htm|html)$/i,

        use:[ 'html-withimg-loader']

    }

    3.在src/index.html加入<img src="./images/bg.js"/>

    4.运行打包操作,打包完成后会发现src的url也会打进去了

    注意:此模块要结合extract-text-webpack-plugin进行使用,就可以解决图片的路径问题

    △分离less文件到css文件中

    1.运行npm install less less-loader --save-dev

    2.在src/css目录下新建style.less文件,写入:

    @bgcolor:red;

    #div-title{

        width:100px;

        height:100px;

        background-color:@bgcolor;

    }

    3.在入口文件(index.js)中引入该less文件:import less from "./css/style.less";

    4.在webpack.conf.js中module中将加入:

    {

        test:/\.(less)$/,

        use: extractTextPlugin.extract({

            fallback: "style-loader",

            use: extractTextPlugin.extract({

                fallback: "style-loader",

                use: [{

                    loader:"css-loader"

                },

                {

                    loader:"less-loader"

                }]

            })

        })

    }

    5.打包测试

    注意:less打包也需要配合extract-text-webpack-plugin进行使用与输出

    △分离sass文件到css文件中

    sass中分两种语法:

    sass语法:不能带大括号、分号,不然会出现语法错误,如,

    #abc

        width: 100px

        height: 100px

    注意:width: 100px中:后必须要有空格否则会出现语法错误,这点值得注意

    scss语法:跟原来css写法一样

    1.运行npm install node-sass sass-loader --save-dev

    2.在src/css目录下新建style.scss文件,写入:

    $fontColor:red;

    #div-title{

        color:$fontColor;

    }

    3.在入口文件(index.js)中引入该sass文件:import sass from "./css/style.scss";

    4.在webpack.conf.js中module中将加入:

    {

        test:/\.(sass|scss)$/,

        use: extractTextPlugin.extract({

            fallback: "style-loader",

            use: extractTextPlugin.extract({

                fallback: "style-loader",

                use: [{

                    loader:"css-loader"

                },

                {

                    loader:"sass-loader"

                }]

            })

        })

    }

    5.打包测试

    注意:sass打包也需要配合extract-text-webpack-plugin进行使用与输出

    △给需要css3属性加上前缀

    1.执行npm install postcss-loader autoprefixer --save-dev

    2.在项目根目录下新建名为postcss.config.js文件,并在里面写入:

    module.exports={

        plugins:[

            //安装的插件名称

            require("autoprefixer")

        ]

    }

    3.在webpack.conf.js的module的rules下.css规则下加入:

    {

        loader:"postcss-loader"

    }

    这种写法可以在后面加入其它参数选项,还可以使用这种方式:

    "postcss-loader"

    4.在.css文件中加入存在兼容问题的属性:

    transform: rotate(45deg);

    appearance: none;

    5.打包测试

    注意:如果打包没问题,一般css文件中就会自动给需要加前缀的属性加上前缀,如:

    -webkit-transform: rotate(45deg);

            transform: rotate(45deg);

    -webkit-appearance: none;

        -moz-appearance: none;

            appearance: none;

    △删除没用使用过的css样式(冗余样式)

    1.执行npm install purifycss-webpack purify-css --save-dev(--save-dev等价于-D)

    2.在webpack.conf.js文件中加入:

    const glob = require("glob");

    const PurifyCSSPlugin = require("purifycss-webpack");

    3.在webpack.conf.js的plugins中加入:

    new PurifyCSSPlugin({

        //通过这个插件检索src下所有html文件没有使用到的css属性进行删除

        paths:glob.sync(path.join(__dirname, "src/*.html"))

    })

    4.打包测试

    △使用devtool进行调试

    在webpack.conf.js中加入参数:

    devtool:'cheap-source-map'

    具体的参数值参考https://blog.csdn.net/qq_39963971/article/details/78218970

    △引入jquery

    方法一(局部引入):

    1.执行npm install jquery --save-dev

    2.在入口文件引入jquery

    import $ from 'jquery';

    3.使用jquery进行常规操作即可

    方法二(全局引入):

    1.执行npm install jquery --save-dev

    2.在webpack.conf.js中引入

    const webpack = require('webpack');

    3.在webpack.conf.js的plugins中使用:

    new webpack.ProvidePlugin({

            $:"jquery"

        })

    4.使用jquery进行常规操作即可

    △使用BannerPlugin声明版权信息

    1.在webpack.conf.js中引入webpack:

    const webpack = require("webpack");

    2.在webpack.conf.js中plugins中声明版权信息:

    new webpack.BannerPlugin('JS版权所有,看官方免费视频到js.com收看')

    △使用ProvidePlugin引入插件

    1.执行npm install jquery --save-dev

    2.webpack.conf.js中entry中加入:

    jquery:'jquery'

    2.在webpack.conf.js中引入webpack

    const webpack = require("webpack");

    3.在webpack.conf.js的entry中引用:

    jquery:'jquery'

    4.在webpack.conf.js的plugins中引入插件:

    //(4.0之前版本)

    new webpack.optimize.CommonsChunkPlugin({

        //name对应入口文件中的名字,我们起的是jQuery,多个插件用['jquery', 'vue']

        name:'jquery',

        //把文件打包到哪里,是一个路径,多个插件用filename:"dist/js/[name].js",

        filename:"dist/js/jquery.js",

        //最小打包的文件模块数,这里直接写2就好

        minChunks:2

    })

    //(4.0版本之后),要与entry和devServer平级

    optimization:{

            splitChunks:{

                cacheGroups:{

                    commons:{

                        name:'jquery',

                        filename:"dist/js/jquery.js",

                        minChunks:2

                    }

                    //如果抽离多个类库写在这里

                }

            }

        }

    △静态资源集中输出

    1.执行npm install copy-webpack-plugin --save-dev

    2.在webpack.conf.js引入安装好的插件

    const copyWebpackPlugin = require("copy-webpack-plugin");

    3.在webpack.conf.js中plugins中引入:

    new copyWebpackPlugin([{

        //需要打包的目录

        from: __dirname + "/src/public",

        //目标目录,使用相对路径即可,相对于打包后的路径

        to: "./public"

    }])

    4.在项目根目录下新建public目录,随便新建一个文件,进行打包测试

    △引入json文件

    1.在src下新建一个文件名叫config.json,内容为:

    {

        "name":"张三",

        "age":24,

        "sex":"男"

    }

    2.在入口文件使用:

    var json = require("./config.json");

    3.使用alert打印json里的属性

    △启动webpack中的热更新

    1.在webpack.conf.js引入:

    const webpack = require("webpack");

    2.在webpack.conf.js中的plugins加入:

    new webpack.HotModuleReplacementPlugin()

    相关文章

      网友评论

          本文标题:webpack随笔纪要

          本文链接:https://www.haomeiwen.com/subject/isdihttx.html