zoukankan      html  css  js  c++  java
  • 《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: 

  • 相关阅读:
    c语言结构体数组引用
    c语言结构体数组定义的三种方式
    如何为SAP WebIDE开发扩展(Extension),并部署到SAP云平台上
    SAP SRM ABAP Webdynpro和CFCA usb key集成的一个原型开发
    使用SAP API portal进行SAP SuccessFactors的API测试
    SAP UI5应用里的页面路由处理
    在SAP WebIDE Database Explorer里操作hdi实例
    如何使用SAP事务码SAT进行UI应用的性能分析
    使用SAP WebIDE进行SAP Cloud Platform Business Application开发
    SAP CRM WebClient UI ON_NEW_FOCUS的用途
  • 原文地址:https://www.cnblogs.com/ljjdyz/p/13599611.html
Copyright © 2011-2022 走看看