• 《webpack》之从入门到放弃 -- 学习笔记【一】


    Webpack 入门

    Webpack 是一个前端资源加载/打包工具。它将根据模块的依赖关系进行静态分析,然后将这些模块按照指定的规则生成对应的静态资源。

    从图中我们可以看出,Webpack 可以将多种静态资源 js、css、less 转换成一个静态文件,减少了页面的请求。

    接下来开始webpack的之从入门到放弃 之旅。。。

    正式使用Webpack前的准备

    1、创建项目文件目录结构

       Webpack可以使用npm安装,先新建一个空的练习文件夹(此处命名为webpack-study)并新建如下图目录文件夹:

    2、创建package.json文件

          在上述练习文件夹中创建一个package.json文件,这是一个标准的npm说明文件,里面蕴含了丰富的信息,包括当前项目的依赖模块,自定义的脚本任务等等。

         在终端中使用npm init命令可以自动创建这个package.json文件。

         我是用的编程工具是vsCode,使用快捷键ctrl + ~  打开终端,在当前项目路径下输入 npm init -y

    npm init -y 【(-y 代表yes ,省去了默认选项点击)

    可以看见项目目录下自动生成了package.json文件

    3、创建index.html页面

         现在开始在index.html文件中写入最基础的html代码,实现一个ul-li 列表隔行变色的功能。

         使用vdcode 在body 中写入 ul>li*10{这是第$个li} ,会自动补全以下代码

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
    </head>
    <body>
        <ul>
            <li>这是第1个li</li>
            <li>这是第2个li</li>
            <li>这是第3个li</li>
            <li>这是第4个li</li>
            <li>这是第5个li</li>
            <li>这是第6个li</li>
            <li>这是第7个li</li>
            <li>这是第8个li</li>
            <li>这是第9个li</li>
            <li>这是第10个li</li>
        </ul> 
    </body>
    </html>

    4、引入jquery来实现隔行变色功能

      这里我们用jquery来完成这个功能,打开vscode终端安装jquery包。

    npm i jquery -s

    jquery包已安装成功后, 按照平时一般的开发步骤,此时我们应该在index.html中引入jquery包供当前页面使用,但是在webpack中是不推荐在html页面中直接引用安装的包和任何css文件。

    我们直接在main.js中引用jquery.

    main.js 中代码如下:

    //这里是main.js 项目的js入口文件
    
    //1、导入jquery
    //import ** from **   是es6中导入模块的方式
    import $ from 'jquery'
    
    //使用jquery选择器分别渲染奇数行和偶数行的颜色
    $(function(){
        $('li:odd').css('backgroundColor','lightblue')
        $('li:even').css('backgroundColor',function(){
            return '#' + 'D97634'
        })
    })

    然后在index.html 中引入main.js

    <script src = "./main.js"></script>

    现在在浏览器中 打开index.html 页面,查看结果

    发现隔行变色效果没有实现,报错语法错误,import语法不能被识别。这是由于es6的写法比较高级,当前浏览器还不能够识别,解析不了。

    5、正式使用Webpack

    此时可以用webpack来进行处理,全局安装webpack 和 webpack-cli。(webpack4.x版本以后,需要分别安装webpack  和 webpack-cli,之前版本只需要安装webpack即可)

    npm install webpack webpack-cli -g

     可以看见安装成功的版本为webpack@4.44.1  ;webpack-cli@3.3.12

    安装成功后,使用webpack来对main.js进行处理

    webpack .srcmain.js -o .distundle.js

     可以看见webpack帮我们生成的 bundle.js已经成功。

    然后在index.html中引入bundle.js。

    <!-- <script src = "./main.js"></script> -->
        <script src="../dist/bundle.js"></script>

    此时在浏览器中打开index.html。发现隔行变色功能已经成功了。

     经过刚才的演示,总结webpack可以为我们做什么?

    1、webpack能够处理js文件间的相互依赖关系。(整个页面只需要引入一个js就完事了)

    2、webpack能够处理js的兼容问题,把高级的、浏览器不识别的语法 转为低级的 浏览器能够识别的语法

       (语法格式为:webpack ‘需要打包的文件路径’  -o  ‘输出打包文件的路径’ )

    6、webpack最基本的配置文件的使用

    现在有一个问题:我们每改变一次main.js文件,就要重新运行一次 webpack .srcmain.js -o .distundle.js 命令。通过配置文件将命令简化为webpack。

    修改mian.js中 li:odd 偶数行的颜色 为 :yellow

    在webpack-study 根目录下,创建一个webpack.config.js文件,输入以下内容

     1 const path = require('path')
     2 
     3 //这个配置文件其实就是一个js文件,通过node中模块化操作,向外暴露一个配置对象
     4 module.exports = {
     5     //入口,表示要使用webpack打包的文件
     6     entry:path.join(__dirname,'./src/main.js'),
     7     output:{
     8         //指定打包好的文件输出的目录
     9         path:path.join(__dirname,'./dist'),
    10         //这是指定输出文件的名称
    11         filename:'bundle.js' 
    12     }
    13 }

    现在在终端运行webpack命令,这样在dist文件下就生成了一个新的bundle.js文件

    刷新index.html页面,可以看到修改后的效果:

    总结:当在控制台输入 webpack 命令执行编译的时候,weboack做了以下几步:

      1.首先webpack发现没有通过webpack .srcmain.js -o  .distundle.js 的形式给他指定入口和出口
      2.webpack就会去根目录找一个叫 webpack.config.js的配置文件
      3.解析这个配置文件,拿到配置文件的配置对象
      4.拿到配置文件后,就拿到了文件中指定的入口和出口,然后进行打包构建

    7 、webpack-dev-server的基本使用

    现在有一个问题是:我们每改变一次main.js文件,就要重新运行一次webpack命令,想要一个自动编译刷新页面的功能

    使用webpack-dev-server这个工具,来实现自动打包编译的功能 

        1.运行 npm i webpack-dev-server -D 把这个工具安装到项目的本地开发依赖
     
     
        2.由于我们是在项目中本地安装的 webpack-dev-server ,所以无法把他当作脚本命令再powershell
           终端中直接运行;(只有那些安装到全局 -g的共聚才可以在终端中正常执行)
        3.如果想正常运行  webpack-dev-server这个工具,还必须在本地项目中安装webpack(npm i webpack -D)
        4.package.json文件中添加 "dev": "webpack-dev-server",然后终端中运行 npm run dev 执行脚本命令
     
     
        5.执行命令后可以通过http://localhost:8080/src/访问项目
        6.webpack-dev-server 帮我们打包好的 bundle.js文件并没有存放到实际的物理磁盘上,二十直接托管到了 电脑的内存中,所以在项目根目录中根本找不这个打包好的                    bundle.js
     

    红框中说明项目本地运行地址,在浏览器中输入 http://localhost:8080/  就可以打开项目

    绿框中说明webpack打包输出的文件在该项目根路径下,下面绿字说明打包生成的文件为bundle.js

    所以:在index.html中要将<script src="../dist/bundle.js"></script>换成<script src="/bundle.js"></script>

    这个bundle.js文件是托管在项目的根路径下,所以我们看不见这个文件,但是这个文件存在,可以在浏览器中输入地址http://localhost:8080/bundle.js打开文件。

    运行完npm run dev以后,我们改动main.js文件中的内容,保存以后,项目就会自动运行,重新打包生成新的bundle.js文件替换原来的

    但是,运行npm run dev以后,需要我们手动点击http://localhost:8080/  才可以打开项目。

     

    8、webpack-dev-server的常用命令参数

    在package.json文件中配置(更改以下配置文件后,使用ctrl + c 终止终端服务,npm run dev 重启服务器):

    "dev": "webpack-dev-server --open"    运行npm run dev 会自动打开浏览器

    "dev": "webpack-dev-server --open --port 3000"   运行npm run dev 会自动打开浏览器,此时的端口号为3000

    "dev": "webpack-dev-server --open --port 3000 --contentBase src" --contentBase src指定运行的根路径,这样打开http://localhost:3000/就直接是我们的项目主页面了,因为src文件夹下有index.html

    "dev": "webpack-dev-server --open --contentBase src --hot"  --hot  添加这个命令以后,更新main.js中的代码,自动运行不会重新生成bundle.js文件替换之前的bundle.js文件,而是以补丁的形式更新,如下图

     

    9、webpack-dev-server配置命令的第2种方式(了解即可)

    : "webpack-dev-server" 除了可以在package.json文件中配置,还可以在webpack.config.js中配置

    10、html-webpack-plugin插件的两个基本作用

    index.html是物理磁盘上的HTML页面,但bundle.js是托管到内存中的文件,那么,如何把HTML页面也导入到内存中呢?

    (1)安装插件 npm i html-webpack-plugin -D

    (2)在webpack.config.js中配置

    当使用了这个插件以后,我们就不需要手动处理bundle.js的引用路径了,因为这个插件,已经自动帮我们创建了一个合适的script,并引用了正确的bundle.js的路径。因此就可以把物理磁盘中的index.html中<script src="/bundle.js"></script>注释掉了。

    运行npm run dev,打开页面以后,可以查看页面源代码,我们就会发现:

    内存中的index.html比我们磁盘中的index.html,在body底部多了一行<script type="text/javascript" src="bundle.js"></script>

    html-webpack-plugin插件的两个基本作用是:

    (1)自动在内存中根据指定页面生成一个内存中的页面

    (2)自动把打包好的bundle.js追加到页面中去

    11、loader-配置处理css样式表的第三方loader

    在css文件夹下,建一个index.css文件,以前我们是在index.html中直接用link引入CSS文件,但是这样会发起二次请求,所以不建议这样做。

    在mian.js中,使用import导入index.css

    webpack默认只能处理js类型的文件,无法处理其他非js类型的文件

    如果要处理非js类型的文件,我们需要手动安装一些合适第三方 loader加载器

    1、打包处理css文件,需要安装 npm i style-loader css-loader -d

    2、在webpack.config.js配置文件中新增一个配置节点,叫做modul对象,在这个对象里面,有一个rules 属性的数组,这个数组中可以配置所有第三方文件的 匹配和处理规则

     在webpack.config.js文件的exports中增加module:

    12、loader-分析webpack调用第三方loader的过程

     

     例如,在处理CSS文件,找到对应规则后,会先调用'css-loader',然后把处理结果给'style-loader',调用'style-loader'处理完以后,直接交给webpack进行打包合并,输出到bundle.js中去。

    13、loader-配置处理less文件的loader

    (1)在css文件夹下建一个文件index.less,写一些样式,然后,在mian.js中,使用import导入index.less

    1 //使用import 语法,导入less样式
    2 import './css/index.less'

    (2)装包

      npm i less-loader -D

      npm i less -D   

    (3)配置规则

    14、loader-配置处理scss文件的loader

             步骤同less-loader的配置

    15、webpack中url-loader的使用

         默认情况下,webpack无法处理CSS文件中的URL地址,不管是图片还是字体库,只要是URL地址,都处理不了

    (1)npm i url-loader file-loader -D

       file-loader是url-loader的内部依赖,配置匹配规则时只需要加入url-loader

    16、webpack中使用url-loader处理字体文

    (1)安装bootstrap3   npm install bootstrap@3

    (2)在index.html中应用bootstrap中的图标

    1 <span class="glyphicon glyphicon-heart" aria-hidden="true"></span>

    (3)bootstrap中的图标依赖bootstrap.css,所以在main.js文件中引入bootstrap.css

    1 //如果通过路径的形式去引入node_modules中的相关文件,可以直接省略路径前面的node_modules这层目录
    2 import 'bootstrap3/dist/css/bootstrap.css'

    (4)bootstrap中的图标依赖bootstrap的字体文件,所以需要配置处理这些字体文件的

    1 //引入bootstrap后处理字体文件的loader
    2 {test:/.(ttf|eot|svg|woff|woff2)$/,use:'url-loader'}

    17、关于webpack和npm中几个问题的说明

    注意:.json文件里面不能写注释

    之前安装过包,会在package.json里面有记录,但不一定代表项目node_modules下就有这个包,如果运行报错,找不到相应的包,注意查看是否包不在了

    18、webpack中babel的配置

    在main.js中写以下几行代码

    1 class Person {
    2     static info = {name: 'zs', age: 20 }
    3 }
    4 // 访问Person类身上的info静态属性
    5 console.log(Person.info);

    class关键字,是ES6中提供的新语法,是用来实现ES6中面向对象编程的方式

    使用static关键字,可以定义静态属性,所谓静态属性,就是可以通过类名,直接访问的属性

    实例属性:只能通过类的实例,来访问的属性,叫做实例属性

    在webpack中,默认只能处理一部分ES6的新语法,一些更高级的ES6或者ES7语法,webpack是处理不了的,例如class定义的类;

    这时候需要借助第三方的loader,帮助webpack处理这些高级的语法,当第三方loader把高级语法转为低级的语法之后,会把结果交给webpack去打包到bundle.js中。

    通过Babel,可以将高级语法转换为低级语法

    1.在webpack中,可以运行如下两套命令,安装两套包,去安装Babel相关的loader功能:

    1.1 第一套包(Babel的转换工具): cnpm i babel-core babel-loader babel-plugin-transform-runtime -D(这里有坑:babel-loader@7.x 对应 babel-core@6.x  需要安装对应的版本,不然会报错)

    1.2 第二套包(Babel语法插件):cnpm i babel-preset-env babel-preset-stage-0 -D

    2.打开webpack的配置文件,在module节点下的rules数组中,添加一个新的匹配规则:

    2.1 { test:/.js$/, use: 'babel-loader', exclude:/node_modules/ }

    2.2 注意:在配置babel的loader 规则的时候,必须把node_modules目录,通过exclude选项排除掉,原因有二:

    2.2.1 如果不排除掉node_modules,Babel会把node_modules中所有的第三方JS文件,都打包编译,这样,会非常消耗CPU,同时打包速度非常慢;

    2.2.2 就算Babel把所有node_modules中的JS转换完毕,项目也无法正常运行。

    3. 在项目根目录中,新建一个叫做.babelrc的Babel配置文件,这个配置文件属于JSON格式,所以在写Babel配置文件的时候,必须符合JSON语法规范:不能写注释,字符串必须用双引号

    3.1 在.babelrc配置文件中,写如下配置:

    1 {
    2     "presets": [ "env", "stage-0" ],
    3     "plugins": [ "transform-runtime" ]
    4 }

    运行项目可以看见页面控制台打印出  Person对象的静态属性info: 

  • 相关阅读:
    HDU2519(组合数计算)
    CodeForces
    UVA 10976(暴力)
    UVA 11059(暴力)
    UVA725
    配置三层交换机DHCP
    通过三层交换机不同vlan之间通信
    AGC006C & CF1110E
    多项式全家桶
    一些模板(持续更新中)
  • 原文地址:https://www.cnblogs.com/ljjdyz/p/13599611.html
Copyright © 2020-2023  润新知