webpack4.28.3版本

webpack是什么呢?

  • 模块打包机,分析目录结构,找到js模块(包括浏览器不能识别的代码typscript sass...),打包成合适的格式供浏览器访问。
  • 模块打包 构建(项目)

打包的优势(webpack的优势)

  • 1、模块化,拆分了业务复杂的js代码 => 细小的文件
  • 2、js拓展 => 基于原型面向对象 => 基于class(typscript es6)=> 浏览器识别

面试会问到

  • webpack grunt gulp 这三者的区别:grunt、gulp优化流程的工具,webpack是模块化支持的工具,具有优化流程的功能。

webpack的工作原理

  • 他有个js的主入口文件,主入口文件里面有很多相关的文件。打包的时候就从主入口文件进入,按照包含路径一直找下去,最后全部打包成一个js文件(bundle.js)这个js文件就是供浏览器识别的文件。
webpack安装:
  • 先安装nodejs环境(一直点next,检测是否安装好,输入npm命令会有版本相关内容)
  • 初始化项目:npm init (会有一个package.json文件,这个文件里面有很多初始化信息如下图)
    package.json
  • 安装webpack:npm install webpack --save-dev
  • 打包:webpack 要打包的文件名 打包以后的文件名
多个js的引入
  • require("./js文件名") 在一个js文件的头部
css打包
  • 对于外来文件(不支持的文件) => loader插件(支持文件打包的工具)
  • css-loader (加载css文件)
  • style-loader (支持css运行)
  • 安装:npm install css-loader style-loader --save-dev
  • 引入css文件:require("style-loader!css-loader!./css文件")

注意:在项目中,追加了文件(修改了代码),都需要重新打包

常用打包参数:
  • webpack 要打包的文件名 打包以后的文件名 --参数名 --参数名 ...
  • --watch 自动更新
  • --progress 显示打包进度
  • --display-modules 列出打包模块
  • --display-reasons 打包原因
  • --config 新配置文件名 修改webpack默认的配置文件
  • -p 压缩混淆脚本
  • ctrl+c 终止前一个命令

构件项目的详细事项

  • 1、新建项目文件夹
  • 2、npm init 初始化项目
  • 3、npm install webpack --save-dev 安装webpack
  • 4、构建项目文件目录:
    • src 源文件夹
    • dist 打包后文件夹
    • webpack.config.js webpack默认的配置文件如下
module.exports = {
    entry:"./src/script/main.js", //输入路径
    output:{
        path:"E:\\HBuilder\\webtest\\dist\\js\\", //输出路径(widows下需要绝对路径是双斜杠转义,苹果和lunix不需要转义直接./路径的写法)
        filename:"bundle.js" // 输出文件名
    }
}
/*
还可以这种写法
var paths = require("path");path是node自带模块,路径
module.exports = {
    entry:"./src/script/main.js",
    output:{
        path:paths.join(__dirname,"dist","js"), 
        filename:"bundle.js" 
    }
}
*/
  • 在package.json文件里面配置webpack,可以用npm run来启动(在这个版本里必须要安装webpack-cli才能跑起来)
"scripts": {
    "bulid": "webpack"
  }
  • entry 三种调用形式:
    • entry: "./src/script/main.js" 单入口文件
    • entry:["文件路径","文件路径"...] 多入口文件 数组
    • entry:{path:"url路径",path:[]} 混合模式(不常用)

混合模式避免打包后的文件重名:webpack提供的命名方式[name] - [chunkhash] 名称加哈希值

//数组多入口文件写法
var paths = require("path");
module.exports = {
    entry:["./src/script/main.js","./src/script/a.js"],
    output:{
        path:paths.join(__dirname,"dist","js"), 
        filename:"bundle.js" 
    }
}
html-webpack-plugin插件
  • 每次文件名称都不同,引用src文件名称不确定,正确引用就用到插件
  • html-webpack-plugin:安装命令npm install html-webpack-plugin --save-dev
  • 使用:在webpack.config.js文件引入var htmlPlugin = require("html-webpack-plugin"),在下面新建对象new htmlPlugin如下,跑起来过后打包后的文件里面多了个index.html文件
var htmlPlugin = require("html-webpack-plugin") ;
var paths = require("path");
module.exports = {
    entry:["./src/script/main.js","./src/script/a.js"],
    output:{
        path:paths.join(__dirname,"dist","js"), 
        filename:"bundle.js" 
    },
        plugins:[
                new htmlPlugin({
                        template:"index.html"   //这里是让根目录的index文件映射到打包后录下的index里面
                });
        ]
}
loader:程序中资源文件进行转换,是nodejs中的函数,可以将资源作为参数来使用并且返回新的资源
  • 作用:转化es6、处理less sass 图片 其他文件元素...
  • 安装命令:npm install --save-dev babel-loader babel-core
  • 上一步安装完了再安装最新的:npm install --save-dev babel-preset-latest
var htmlPlugin = require("html-webpack-plugin") ;
var paths = require("path");
module.exports = {
    entry:["./src/script/main.js","./src/script/a.js"],
    output:{
        path:paths.join(__dirname,"dist","js"), 
        filename:"bundle.js" 
    },
        loaders:[
            {
                   test:/\.js$/, //以js结尾的文件
                    loader:"babel-loader", //用babel-loader处理  es6语法
                    exclude:path.resolve(__dirname,"node_modules"), //处理node_modules的内容(已经处理过的文件就不再处理) 
                    include:path.resolve(__dirname,"src")  //打包的范围(src文件夹里面的内容需要打包)
                    query:{
                          presets:["latest"] //最新的babel来处理
                    }
              }
        ]
        plugins:[
                new htmlPlugin({
                        filename:"index.html", //文件名
                        template:"index.html" ,  //这里是让根目录的index文件映射到打包后录下的index里面
                         inject:"body" //打包后的js文件添加在哪里,也可以不加默认在body里面也可以修改到其他地方
                });
        ]
}
css如何处理
  • 下载css处理插件:npm install style-loader css-loader --save-dev
  • 然后在配置文件里面添加参数如下,在主文件引入css文件
var htmlPlugin = require("html-webpack-plugin") ;
var paths = require("path");
module.exports = {
    entry:["./src/script/main.js","./src/script/a.js"],
    output:{
        path:paths.join(__dirname,"dist","js"), 
        filename:"bundle.js" 
    },
        loaders:[
            {
                   test:/\.js$/, //以js结尾的文件
                    loader:"babel-loader", //用babel-loader处理  es6语法
                    exclude:path.resolve(__dirname,"node_modules"), //处理node_modules的内容(已经处理过的文件就不再处理) 
                    include:path.resolve(__dirname,"src")  //打包的范围(src文件夹里面的内容需要打包)
                    query:{
                          presets:["latest"] //最新的babel来处理
                    }
              },
              {
                    test:/\.css$/, //以css结尾的文件
                    loader:"style-loader!css-loader"
                }
        ]
        plugins:[
                new htmlPlugin({
                        filename:"index.html", //文件名
                        template:"index.html" ,  //这里是让根目录的index文件映射到打包后录下的index里面
                         inject:"body" //打包后的js文件添加在哪里,也可以不加默认在body里面也可以修改到其他地方
                });
        ]
}
  • 处理less sass 下载命令:npm install less-loader(或sass-loader) --save-dev
  • 在配置文件里面添加下loader
//less
{
    test:/\.less$/, //以less结尾的文件
    loader:"style-loader!css-loader!less-loader" 
}
sass
{
    test:/\.sass$/, //以sass结尾的文件
    loader:"style-loader!css-loader!sass-loader" 
}
html如何处理
  • 下载html-loader插件命令:npm install html-loader --save-dev
  • 在配置文件里添加loader,然后在模板里面修改import tpl from "html文件路径"
  • 在根目录下的index.html里留个放模板id=app的地方,然后在app.js里面创建变量获取到模板的dom,然后把要添加的html页面放入进去就好了。
var htmlPlugin = require("html-webpack-plugin") ;
var paths = require("path");
module.exports = {
    entry:["./src/script/main.js","./src/script/a.js"],
    output:{
        path:paths.join(__dirname,"dist","js"), 
        filename:"bundle.js" 
    },
     module:{
          loaders:[
              {
                   test:/\.js$/, //以js结尾的文件
                    loader:"babel-loader", //用babel-loader处理  es6语法
                    exclude:path.resolve(__dirname,"node_modules"), //处理node_modules的内容(已经处理过的文件就不再处理) 
                    include:path.resolve(__dirname,"src")  //打包的范围(src文件夹里面的内容需要打包)
                    query:{
                          presets:["latest"] //最新的babel来处理
                    }
              },
              {
                    test:/\.css$/, //以css结尾的文件
                    loader:"style-loader!css-loader"
                },
              {
                    test:/\.html$/, //以html结尾的文件
                    loader:"html-loader"
                }
          ]
      },
      plugins:[
                new htmlPlugin({
                        filename:"index.html", //文件名
                        template:"index.html" ,  //这里是让根目录的index文件映射到打包后录下的index里面
                         inject:"body" //打包后的js文件添加在哪里,也可以不加默认在body里面也可以修改到其他地方
                });
        ]
}

//模板文件里处理
import tpl from "./layer.html";
function(){
    return{
        name:"张三",
        tpl:tpl
    }
}
export default layer;

//在根目录index.html下留下模板位置
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>index</title>
    </head>
    <body>
        <div id="app">
            
        </div>
    </body>
</html>

图片处理
  • 图片常用格式jpg gif png,要处理css中的图片和html img标签里面的图片
  • 下载图片文件处理命令:npm install file-loader --save-dev
var htmlPlugin = require("html-webpack-plugin") ;
var paths = require("path");
module.exports = {
    entry:["./src/script/main.js","./src/script/a.js"],
    output:{
        path:paths.join(__dirname,"dist","js"), 
        filename:"bundle.js" 
    },
        loaders:[
            {
                   test:/\.js$/, //以js结尾的文件
                    loader:"babel-loader", //用babel-loader处理  es6语法
                    exclude:path.resolve(__dirname,"node_modules"), //处理node_modules的内容(已经处理过的文件就不再处理) 
                    include:path.resolve(__dirname,"src")  //打包的范围(src文件夹里面的内容需要打包)
                    query:{
                          presets:["latest"] //最新的babel来处理
                    }
              },
              {
                    test:/\.css$/, //以css结尾的文件
                    loader:"style-loader!css-loader"
                },
              {
                    test:/\.html$/, //以html结尾的文件
                    loader:"html-loader"
                }
              {
                    test:/\.(jpg | gif | png)$/, //以ipg || gif || png结尾的文件
                    loader:"file-loader"
                }
        ]
        plugins:[
                new htmlPlugin({
                        filename:"index.html", //文件名
                        template:"index.html" ,  //这里是让根目录的index文件映射到打包后录下的index里面
                         inject:"body" //打包后的js文件添加在哪里,也可以不加默认在body里面也可以修改到其他地方
                });
        ]
}

import layer from "文件路径" 从layer文件夹里面导入layer.js到本文件里面(es6语法)
export default layer 导出函数layer
@import "css文件路径" css文件里面导入css文件的写法

npm 命令

  • npm list --depth=0 -global 查看全局下载的所有包
  • npm uninstall -g [包名] 卸载安装包

搭建一个完整项目的步骤

  • 1、新建项目文件
  • 2、npm init npm初始化(就会生成一个package.js文件)
  • 3、npm install webpack webpack-cli --save-dev 安装webpack和webpack-cli 因为我这里安装的是版本4.28.3所以必须安装-cli(这时多了node_modules文件夹是nodejs的配置内容,还会生成package-lock.json这个文件是绑定package.json依赖。这两个都是默认的不用管)
  • 4、创建项目文件夹目录。webpack.config.js里面是webpack的配置设置,src里面是放被打包文件,components里面放layer里面放模板文件,app.js为主入口文件,dist里面放打包后文件
  • 5、下载一个项目的所有插件也就是上面提到的所有。html-webpack-plugin插件、loader资源器、style-loader css-loader样式处理、html-loader页面处理、file-loader文件图片处理
  • 6、配置package.json文件,在scripts自定义里面配置启动webpack用命令npm run [自定义名],我这里配置的时候后面还加了个参数自动更新可以添加多个
  • 7、配置webpack.config.js文件,基本的包括入口,出口,插件的配置
//webpack.config.js里面的内容
var htmlPlugin = require("html-webpack-plugin");//引入html-webpack-plugin插件,让根目录index.html页面映射到dist里面去
var path = require("path");//这是nodejs自身的path函数,获取到准确的路径
module.exports = {
    entry:"./src/app.js",//入口主文件
    output:{
        path:path.join(__dirname,"dist"),//打包到哪个文件的路径(windows是用绝对路径,lunix和苹果是相对路径)
        filename:"bundle.js"//打包过后的文件名
    },
    module:{
        loaders:[
            {
                test:/\.js$/,//正则:以js结尾的文件
                loader:"babel-loader",//用babel-loader处理  es6语法
                exclude:path.resolve(__dirname,"node_modules"), //处理node_modules的内容(已经处理过的文件就不再处理) 
                include:path.resolve(__dirname,"src"), //打包的范围 (src文件夹里面的内容需要打包)
                query:{ //执行过程
                    presets:["latest"]//最新的babel来处理
                }
            },
            {
                test:/\.css$/, //正则:以css结尾的文件
                loader:"style-loader!css-loader" //用style-loader css-loader处理
            },
            {
                test:/\.html$/, //正则:以html结尾的文件
                loader:"html-loader" //用html-loader处理
            },
            {
                test:/\.(jpg|gif|png)$/, //正则:以jpg || gif || png结尾的文件
                loader:"file-loader" //用file-loader处理
            }
        ]
    },
    plugins:[
        new htmlPlugin({
            filename:"index.html", //文件名
            template:"index.html", //使用html-webpack-plugin插件的语法,让根目录index映射到dist里面
            inject:"body" //打包后的js文件添加在哪里,可以不加这句话默认是在body里面也可修改到其他地方
        })
    ]
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容