zoukankan      html  css  js  c++  java
  • webpack初识

      之前自学过一点vue,看vue的官网的时候,觉得这vue真是太简单了,这么容易就实现了数据的双向绑定,于是准备将自己项目的前端重构为vue。vue的官网说对于新手,如果不了解webpack,node之类的可以暂时不管,但随着自己重构的逐渐深入,发现想跳过webpack之类的是不可能的,因为会发现:哇,项目的结构这么复杂,我一个npm run build就跑起来了,这玩意儿到底咋运行的?这么多配置文件跟文件夹都是干啥的,这些里边的配置都是什么意思?会发现项目正朝着不受控制的方向越行越远,这显然是不能被容忍的,webpack必须搞定之!

      于是,便有了本系列,webpack的粗浅认识,目的是了解webpack的打包过程,熟悉webpack的各项配置,为前端开发打牢基础。

    -------------------------------------------------------------------------------------------------------------------

    1、webpack是什么

      一个前端打包工具,最新版本为4,跟之前的版本有较大区别,本部分内容采用版本为4.40.2。这也是目前的最新版本。官网地址为:https://www.webpackjs.com/ (中文) https://webpack.js.org/(英文)。官网的首页图片很形象的描述了webpack是干啥的,就是将一堆less,sass,ts,jpg等转换为我们熟悉的css,js,jpg,供浏览器直接使用。

      从认识上来说,可以认为webpack有如下作用:

      1、打包:将多个js文件打成一个js文件,减少请求次数,降低服务器压力;

      2、转化:比如less,sass转为css,ts转为js,这里需要loader插件的支持;

      3、优化:SPA(Simple Page Application)应用越来越流行,前端项目复杂度高,webpack可以对项目进行优化;

    2、webpack的目录说明:

      1、src 源文件目录
      2、dist 也就是destination,目的地的意思,也就是输出目录
      3、node_modules 依赖包的存储目录,比如依赖了jquery,这里边就会有jquery;
      4、webpack.config.js webpack打包的配置文件;
      5、package.json 项目的主要依赖配置文件,类似于pom文件,可以通过npm init -y生成
      知道了依赖文件,那依赖的模块怎么添加呢,比如我要添加jquery,可以这么来添加 npm install jquery,但这只添加到了本地,如果项目共享给别人,他们是不知道需要依赖jquery的;想要将该依赖写入配置文件,需要这么写 npm install jquery --save-dev ,这是添加到开发环境,其中install可以缩写为i ,--save-dev可以缩写为-D,所以该语句可以缩写为 npm i jquery -D; 生产环境就是 npm install jquery --save ,缩写为npm i jquery -S;
      执行npm i jquery -D ,会在package.json的devDependencies中添加"jquery": "^3.4.1",如果是-S,则在dependencies中添加相关内容;
      npm可以一次安装多个包,中间空格隔开即可,npm install aaa bbb ccc;即为一次安装aaa、bbb、ccc三个依赖;
      而一次性安装devDependencies中的多个依赖,可以npm install -D,相应的dependencies对应的依赖,应该用npm install -S。
    3、webpack的构成:
      1、入口 entry
      2、出口 output --打包后的输出
      3、loaders 转化器 --将less,sass等转换为css的类型转换模块
      4、插件 plugins --
      5、devServer -- 开发服务器
      6、mode -- 4.0版本以后添加的内容,用于配置开发环境、生产环境等
      以上内容会配置在webpack.config.js文件中

    4、webpack的hello world项目

      1、新建文件夹mydemo,并在其下建立src/index.js;内容为:
    var oRoot = document.querySelector("#root");
    oRoot.innerHTML = "hello world";
      2、在mydemo文件夹下运行:npm init -y,可以看到该命令生成了一个文件package.json,这个就是项目的依赖配置文件;
      3、创建dist文件夹,并在其下创建index.html,内容如下
    <!DOCTYPE html>
    <html>
    <head></head>
    <body>
        <div id="root"></div>
        <script src="bundle.js"></script>
    </body>
    </html>
    

      此时目录结构如下:

      4、在该目录下运行npm install -D webpack-cli,会生成一个node_modules目录,里边是webpack依赖的组件内容;
      5、继续在该目录下,运行npm link webpack
      6、运行webpack ./src/index.js --output ./dist/bundle.js
      可以看到在dist目录生成了一个文件bundle.js,用浏览器打开index.html,可以看到

      额,,,,,虽然最终效果有了,但事情并未结束。首先,这里有个坑:

      mac下的webpack安装,没在win下尝试,不作评论;在mac下,全局安装了webpack后直接在文件夹运行webpack是不行的,会提示没有安装;这里边的套路没理清,但有一条可行的方法是:先全局安装webpack,webpack-cli,webpack-dev-server,然后在文件夹下运行npm install -D webpack-cli跟npm link webpack,再运行webpack就好使了;这里可能牵涉webpack跟node的一些内容,仅作使用了解,暂不讨论; 

       再者,不是还有个webpack.config.js么,我们的怎么没有?

      有没有发现我们的webpack执行命令好复杂?就是因为没有webpack.config.js的原因,我们手动创建这个文件,并填写内容:

    const path = require('path');//node 模块自带全局变量
    module.exports={
        //入口
        entry:{
            a:'./src/index.js' //这个入口的名字a随便取
        },
        //出口
        output:{
            // filename:'./dist/bundle.js'  //这个名字filename是固定的
            // path: __dirname + '/dist',  //这里要配的话,必须是绝对地址
            path:path.resolve(__dirname,'dist'),
            filename:'bundle.js'   //也可以这么写,默认是./dist目录,也可以跟path配合,进行地址拼接
        },
        //打包模式
        mode:'production', //支持三种:development,production,none
        //转化器,loaders相关内容
        module:{},
        //插件
        plugins:[],
        //开发服务器
        devServer:{}
    }
    

      这里边,我们配置了入口跟出口,再次运行webpack打包就没那么麻烦了,直接webpack回车就可以了。对了,这个mode打包模式?这个是用来说明按生产还是开发模式打包的,生产的打包会压缩,开发的不会;如果不配该参数,运行webpack的时候会有一个警告:

       带上这个参数,警告就没了。

      对于webpack.config.js的内容,只需要了解一点,webpack整体是采用commonjs的语法,path为node自带的一个模块,该模块自带有一个全局变量__dirname,也就是当前目录的绝对地址。所以output里边可以直接写path: __dirname + '/dist'来拼装绝对路径。其它的内容在文件的注释已经做了说明,不作赘述。

    ----------------------------------------------------------------------------

      首发的webpack就这么结束吧,流水账式的学习笔记,,,,,

  • 相关阅读:
    C#中的Dictionary类,默认key是区分大小写的
    for循环的3个参数
    C#循环读取文件流,按行读取
    C#合并两个Dictionary的方法
    C#的Equals不区分大小写
    php的isset()和empty()区别
    css !important的作用
    mysql创建用户,并指定用户的权限(grant命令)
    解决安卓微信浏览器中location.reload 或者 location.href失效的问题
    【转】前端懒加载以及预加载
  • 原文地址:https://www.cnblogs.com/nevermorewang/p/11521079.html
Copyright © 2011-2022 走看看