热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

webpackの学习笔记2

codespliting代码分割可以选择加载项目当时只需要的文件loader模块是通过loader处理各种各样的文件,如js文件、css文件、图片模块的打包器安装webpackmk

code spliting 代码分割 可以选择加载项目当时只需要的文件

loader  模块是通过loader处理各种各样的文件,如js文件、css文件、图片

 

模块的打包器

安装webpack

mkdir webpack-test  //建立webpack-test文件夹

cd webpack-test    //进入webpack-test文件夹

npm init          //npm初始化

npm install webpack –save-dev  //在当前文件夹下安装webpack

webpack hello.js hello.bundle.js  //js打包,利用webpack将hello.js打包为hello.bundle.js

 技术分享                                               

 

asset:该次打包对应生成的文件

size:打包文件的大小

chunks:该次打包的分块

chunk Names:块名称

 

将多个js文件打包在一个js文件里,newhell为打包后的js文件:   

 技术分享

 

 技术分享

 

webpack自身不支持css文件打包,处理这种文件需要下载相关的css依赖。

npm install css-loader     //在相应的项目文件下安装css-loader

npm install css-loader style-loader –save-dev

 

打包css文件,相应的css文件可被打包进newhell.js文件中了:

 技术分享

 

 技术分享

 技术分享

css-loader使得webpack可以处理css类型的文件,style-loader把css-loader处理完的文件新建一个标签,插入到当前html文件里。当当前html文件引入打包后的文件后,该段代码就会被执行,而所写的css样式就会被插入到当前html的head标签里。

 技术分享

 技术分享

 

如果css文件过多的情况下每次都引入css-loader、style-loader就比较麻烦,这个问题,我们可以在命令行下进行解决。

webpack hell.js newhell.js –module-bind ‘css=style-loader!css-loader’

如果是css文件将其绑定到style-loader,css-loader

相应的书写js文件中只需要引入require(’./style.css’)即可。

输入webpack –h可以查看webpack的帮助文档,查看一些命令参数

 技术分享

 技术分享

 

webpack hell.js newhell.js --module-bind "css=style-loader!css-loader"  --watch

其中,watch参数,可用来进行监控,当文件发生改变时,进行自动更新自动打包。

Ctrl+C可退出当前命令。

webpack hell.js newhell.js --module-bind "css=style-loader!css-loader"  --progress

其中,progress参数,可以看到打包过程

 

webpack hell.js newhell.js --module-bind "css=style-loader!css-loader"  --progress --display-modules

查看打包模块

webpack hell.js newhell.js --module-bind "css=style-loader!css-loader"  --progress --display-modules –display-reasons

打包相应模块的原因

 

 

建立项目的webpack配置文件:

C:\Users\DELL>d:

d:\>mkdir test6

d:\>cd test6

d:\test6>mkdir webpack-demo1

d:\test6>cd webpack-demo1

d:\test6\webpack-demo1>npm install webpack --save-dev

//在该项目目录下安装webpack

d:\test6\webpack-demo1>mkdir src

d:\test6\webpack-demo1>mkdir dist

webstorm打开该项目,建立inde.html、script、style、webpack.config.js等文件。

webpack的简单配置:

 

var path=require("path");

module.exports={
    entry:‘.src/script/main.js‘,   /*打包的入口文件*/
    output:{                  /*指明打包以后的文件放在什么地方*/
       path:path.resolve(__dirname+‘/dist/js‘),     /*打包以后的文件路径*/
        filename:‘bundle.js‘    /*打包以后的文件名*/
    }
}

 

这里卡了很久啊,上面版本的代码总是提示不是绝对路径,可就算用了绝对路径也是不行,百度了那么久也没找到答案。。。还好有万能的讨论区。。。原来是版本不匹配问题。。。

 配置文件名为webpack.config.js,可直接在命令行输入:webpack

 技术分享

 

如果配置文件名为webpack.dev.config.js,则在命令行输入:webpack webpack.dev.config.js

 

webpack在命令行中使用的一些参数,如何加这些参数呢?这可以配合着npm的一些脚本实现。在package.json中的scripts属性处可定义一段脚本,脚本的内容为真实的webpack的命令。即"webpack":"webpack --config webpack.config.js --progress --display-modules --colors --display-reasons"

然后只需要在命令行运行:npm run webpack,会直接运行我们之前在package.json的scripts属性中预先写好的脚本。

 技术分享

 技术分享

Webpack配置的empty和output: 

empty入口文件有三种形式:字符串、数组、对象

 

入口为字符串形式:

 技术分享

 

入口为数组形式:

 技术分享

入口为对象形式:

 技术分享

Ps:当入口为对象形式时,可能会有多个块chunk,如main、a,那么当打包时就会生成对应个数的打包文件bundle.js,这时就会产生覆盖。为了避免覆盖,不同的chunk生成各自对应的打包文件,则需要在output处做修改,将其打包后的命名方式改变,可以通过[name]或[hash]或[chunkhash]进行占位,生成对应的打包文件名,如下:

 技术分享

 技术分享

 技术分享

 技术分享

技术分享

技术分享

自动生成项目中的html页面:

Index.html页面中需要引入打包后的js文件,那么如果打包后的js文件名不固定该怎么办呢?这里可以通过webpack插件html-webpack-plugin进行解决。先在命令行下载该插件:npm install html-webpack-plugin –save-dev。–save-dev可以实现自动更新package.json文件。然后在webpack.config.js配置文件中建立对该插件的引用:
var htmlWebpackPlugin=require(‘html-webpack-plugin‘);

同时,需要添加Plugins属性

 技术分享

运行npm run webpack,

 技术分享

将在js文件夹(与打包后文件同一文件夹)下生成独立的index.html,该文件中会自动引入打包后名字不固定的打包js文件。但这里生成的index.html文件与我们一开始自己写的index.html文件没有建立联系。

 技术分享

 

自动生成的index.html文件:

 技术分享

自定义的index.html文件:

 技术分享

 

那么该如何建立它们之间的联系呢?或者是否可以让自动生成的html文件以我们一开始自己定义的文件为模板自动生成呢?

我们可以给插件进行传参,传入的参数本质上是一个对象。为其传入一个模板,即为我们自定义的index.html。如下:

 技术分享

 

这里为cpm run webpack运行结果:

 技术分享

这里为自动生成的index.html文件:

 技术分享

 

这样的话,我们自定义的模板文件index.html就不用指定script标签引入打包后的js文件了。

这里还有一个问题:自动生成的index.html文件在js目录里,这与我们实际开发不符。这是因为我们的output中定义输出的路径path即为相应的js文件夹。我们需要修改一下output中的属性设置,如下:

 技术分享

运行npm run webpack ,即可得到我们想要的状态,即js目录下为打包后的js文件,index.html在外面:

技术分享

 

配置文件中插件plugins属性也可以指定我们生成的html文件的名称:

 技术分享

 

运行npm run webpack:

 技术分享

 技术分享

 

 

还可以在plugins中指定我们生成的脚本是放在head标签里还是放在body标签里

 技术分享

运行npm run webpack,打开自动生成的html文件,则可看到自动生成的js文件引入在了head标签里:

 技术分享

 

接着提出新的需求:在参数中传参,在模板中引入?如我们在plugins参数中传入title属性及其值,希望通过模板能够直接获取到传入的title参数及值。

我们在plugins中添加title属性及其值,然后在模板index.html中引入该参数,

 技术分享

 技术分享

 

运行npm run webpack,得到生成的html文件,可以看到title参数值自动加载进来了:

 技术分享

 

Plugins中添加其他参数值也是可以实现的,如:

 技术分享

 技术分享

 

运行npm run webpack,查看生成的html文件:

 技术分享

 

还有一个问题:我们每次运行一次脚本npm run webpack,就会对应生成一个html文件,当脚本运行次数多了,就会产生很多html文件,这样会给我们造成混乱,且不易辨别哪个html文件是刚生成的。这里直接将plugins中的filename:‘index-[hash].html‘,改为filename:‘index.html‘,即可。这样每次生成的文件都以index.html命名,将会覆盖掉前面生成的同名文件。
 

Ps:在模板文件中直接取值用<%= %>; 在模板中直接运行json代码用<% %>

 技术分享

 

 

运行npm run webpack,查看生成html文件,可看到htmlWebpackPlugin的属性有files、options

 技术分享

遍历htmlWebpackPlugin的file及options:

 技术分享

 

运行npm run webpack,得到对应的chunk、js、css文件、所有插件的参数值,打包以后的key与value:

 技术分享

 

增加新的需求:我们想把一部分生成的js放在head标签里,一部分生成的js放在body标签里。这里需要改变自定义的index.html文件。因为该文件可以直接引用打包生成之后的信息,所以我们可以直接通过script标签引入。比如我们把main.js生成的js放在head标签里,把a.js生成的js放在body标签里。这时,我们需要将配置文件中的inject属性值设置为false,同时在自定义模板index.html文件中head和body标签处放置相应的script标签:

 技术分享

 技术分享

运行npm run webpack,即可看到生成的html文件按照我们的要求将打包后的js文件放在相应的位置上了:

 技术分享

 

当我们打包完后项目需要上线,那么上线的地址与我们本地的地址肯定是不一样的,这时我们需要借助output的publicPath属性实现。publicPath可以理解为占位符,publicPath:‘http://cdn.com/‘。运行npm run webpack之后,生成的html文件中引入的js文件的位置即为加上http://cdn.com/的绝对地址,可理解为线上地址:

 技术分享

 
上线的话,需要对进行压缩,可以在plugins中的minity属性对生成的html文件进行压缩:

 技术分享

运行npm run webpack,发现生成的html文件中的注释和空格都没了:

 技术分享

 

 

多页面应用:

多个页面对应着需要自动生成多个html文件,这里借助htmlWebpackPlugin插件可以实现。

给设置生成的chunk进行html插件的调用:

    技术分享  技术分享

技术分享

运行npm run webpack,得到对应的3个html文件:

 技术分享  技术分享

 

上面同一个模板的情况下会造成引入的chunks是一样的,从而导致引入的打包后的js文件是相同的,这与实际需求有出入。为了解决这个问题,可以在配置文件的plugins中添加chunks参数,它是一个数组,不同的chunk对应生成不同的打包js文件。同时将其中的inject参数值改为body,将对应生成的js文件注入到body标签里。

 技术分享

 技术分享

运行npm run webpack,abc三个html页面中引入了对应的打包后的js文件:

 技术分享

技术分享

技术分享

 

 

当entry处有更加多的选择,chunks过多,必须为每个html指定它的chunks,且若它的chunks包含我们之前指定的chunks的绝大多数,若依次为生成的html文件指定chunk,将会非常繁琐。这时htmlWebpackPlugin插件为我们提供了一个参数excludeChunks,表示除了哪些chunks被排除之外:

 技术分享

运行npm run webpack:

 技术分享

技术分享

技术分享

 

 

如果希望页面的内容得到极致,把一些初始化的脚本直接切入页面(inline方式),而不以链接的形式引入到页面(会增加http请求),会提高页面速度和脚本速度,这里需要修改模板index.html和配置文件中的inject参数:

 技术分享

技术分享

运行npm run webpack:

 技术分享

 

 

 

Webpack处理项目资源中的文件:

 

loader:用于对模块的源代码进行转换。Loader可以将文件从不同的语言转换为Javascript,或将内联图像转换为data URL。

 

应用程序中loader使用的三种方法:

(1)  通过配置

通过webpack.config.js。module.rules允许在webpack配置中指定几个loader。如:

 

module:{
  rules:[
 {
   test:/\.css/,
   use:[
   {loader:’style-loader’},
   {loader:’css-loader’,
     options:{
          modules:true
            }
       }
      ]
   }
  ]
}

 

(2)  在require语句中显示使用

可以在require语句中指定loader,使用!将资源中的loader分开,分开的每个部分相对于当前目录解析。如:

require(‘style-loader!css-loader?modules!./style.css’);

(3)  通过CLI

 

 

 

使用babel-loader转换es6代码:

 

npm install --save-dev babel-loader babel-core

//安装babel-loader和babel-core

 

npm install --save-dev babel-preset-latest(1.x)

npm install --save-dev babel-loader babel-core babel-preset-env webpack(2.x)

//安装babel-preset-env

 

两种方式指定:

(1)webpack.config.js中设置

  

 module:{
      loaders:[
          test:/\.js$/,
          loader:‘babel-loader‘,
          options:{
            presets:[‘env‘]
        }
   ]
  }

 

(2)package.json中配置

      

“babel”:{
         “presets”:["env"] 
    }

 

 

 

 

 

 

webpackの学习笔记2


推荐阅读
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • express工程中的json调用方法
    本文介绍了在express工程中如何调用json数据,包括建立app.js文件、创建数据接口以及获取全部数据和typeid为1的数据的方法。 ... [详细]
  • loader资源模块加载器webpack资源模块加载webpack内部(内部loader)默认只会处理javascript文件,也就是说它会把打包过程中所有遇到的 ... [详细]
  • 前言:拿到一个案例,去分析:它该是做分类还是做回归,哪部分该做分类,哪部分该做回归,哪部分该做优化,它们的目标值分别是什么。再挑影响因素,哪些和分类有关的影响因素,哪些和回归有关的 ... [详细]
  • 必须先赞下国人npm库作品:node-images(https:github.comzhangyuanweinode-images),封装了跨平台的C++逻辑,形成nodejsAP ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 本文介绍了Sencha Touch的学习使用心得,主要包括搭建项目框架的过程。作者强调了使用MVC模式的重要性,并提供了一个干净的引用示例。文章还介绍了Index.html页面的作用,以及如何通过链接样式表来改变全局风格。 ... [详细]
  • 从零基础到精通的前台学习路线
    随着互联网的发展,前台开发工程师成为市场上非常抢手的人才。本文介绍了从零基础到精通前台开发的学习路线,包括学习HTML、CSS、JavaScript等基础知识和常用工具的使用。通过循序渐进的学习,可以掌握前台开发的基本技能,并有能力找到一份月薪8000以上的工作。 ... [详细]
  • 如何优化Webpack打包后的代码分割
    本文介绍了如何通过优化Webpack的代码分割来减小打包后的文件大小。主要包括拆分业务逻辑代码和引入第三方包的代码、配置Webpack插件、异步代码的处理、代码分割重命名、配置vendors和cacheGroups等方面的内容。通过合理配置和优化,可以有效减小打包后的文件大小,提高应用的加载速度。 ... [详细]
  • 获取时间的函数js代码,js获取时区代码
    本文目录一览:1、js获取服务器时间(动态)2 ... [详细]
  • React 小白初入门
    推荐学习:React官方文档:https:react.docschina.orgReact菜鸟教程:https:www.runoob.c ... [详细]
  • 前言:原本纠结于Web模板,选了Handlebars。后来发现页面都是弱逻辑的,不支持复杂逻辑表达式。几乎要放弃之际,想起了Javascript中ev ... [详细]
author-avatar
手机用户2502880821
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有