• webpack--介绍、安装及入门


    最早的时候,所有Javascript代码都写在一个文件里面,只要加载这一个文件就够了。后来,代码越来越多,一个文件不够了,必须分成多个文件,依次加载。下面的网页代码,相信很多人都见过。

      <script src="1.js"></script>
      <script src="2.js"></script>
      <script src="3.js"></script>
      <script src="4.js"></script>
      <script src="5.js"></script>
      <script src="6.js"></script>

    这段代码依次加载多个js文件。

    这样的写法有很大的缺点。首先,加载的时候,浏览器会停止网页渲染,加载文件越多,网页失去响应的时间就会越长;其次,由于js文件之间存在依赖关系,因此必须严格保证加载顺序(比如上例的1.js要在2.js的前面),依赖性最大的模块一定要放到最后加载,当依赖关系很复杂的时候,代码的编写和维护都会变得困难。

    WebPack可以看做是模块打包机或项目自动化构建工具:它做的事情是,分析你的项目结构,找到JavaScript模块以及其它的一些浏览器不能直接运行的拓展语言(Scss,TypeScript等),并将其转换和打包为合适的格式供浏览器使用

    webpack是一个前端模块化方案,更侧重模块打包,我们可以把开发中的所有资源(图片、js 文件、css 文件等)都看成模块,通过 loader(加载器)和 plugins(插件)对资源进行处理,打包成符合生产环境部署的前端资源。

    js本身没有模块化的功能,后来出现commonjs支持模块化语法,webpack也支持commonjs的模块化语法,让我们可以使用模块化的方式编写js(比如require引入其他js文件),我们写的模块代码,经过webpack构建和包装之后,能够在浏览器以模块化的方式运行。

    webpack不仅支持commonjs,也支持es6,amd等其他模块化语法

    PS: webpack的模块不仅指js,包括css、图片等资源都可以以模块看待

    自动分析项目中的各种文件,进行相应操作,比如压缩图片、js文件;预编译less,Scss等文件

    方便构建各种运行环境,比如测试环境、生产环境等

    Webpack的工作方式是:把你的项目当做一个整体,通过一个给定的主文件(如:index.js),Webpack将从这个文件开始找到你的项目的所有依赖文件,使用loaders处理它们,最后打包为一个(或多个)浏览器可识别的JavaScript文件。


     
     

     

    1.安装nodejs和npm:

    NPM是随同NodeJS一起安装的包管理工具(安装了nodejs,会自带npm),能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种:

      1.从NPM服务器下载第三方包到本地使用。

      2.从NPM服务器下载并安装第三方命令行程序到本地使用。

      3.将自己编写的包或命令行程序上传到NPM服务器供别人使用。

      由于新版的nodejs已经集成了npm,所以之前npm也一并安装好了。同样可以通过输入 "npm -v" 来测试是否成功安装

    使用以下全局安装最新版npm:

    npm install npm -g

    或安装淘宝镜像npm(cnpm)

    npm install -g cnpm --registry=https://registry.npm.taobao.org

    安装完成后可以用cnpm命令替代npm命令

    更新nodejs:

    第一步,先查看本机node.js版本:
            $ node -v

        第二步,清除node.js的cache:
           $ sudo npm cache clean -f

        第三步,安装 n 工具,这个工具是专门用来管理node.js版本的,别怀疑这个工具的名字,是他是他就是他,他的名字就是 "n"
            $ sudo npm install -g n

        第四步,安装最新版本的node.js
            $ sudo n stable

        第五步,再次查看本机的node.js版本:
            $ node -v

     

    2.安装、创建并初始化项目:

      首先,创建一个项目文件夹:

      mkdir app

     

      安装webpack

    全局安装webpack
    npm i webpack -g
    
    对于大多数项目,我们建议本地安装。这可以使我们在引入破坏式变更(breaking change)的依赖时,更容易分别升级项目。

      

     初始化项目:

      npm init -y

       执行完后,将生产package.json

     package.json定义了这个项目所需要的各种模块,以及项目的配置信息(比如名称、版本、许可证等元数据) 

      也可以执行npm init,加一个-y会默认生成package.json,比如版本号,名称,包名这些会默认生成,如果没有-y,会提示你设置这些参数

       使用-y默认生成后,也可以再执行npm init,手动设置各种配置参数,将会覆盖之前设置的值

    然后本地安装webpack:

    npm install --save-dev webpack   //安装webpack

        npm install --save-dev webpack-cli //4.x需要安装cli

    npm list webpack---查看当前目录本地安装的webpack版本

     

    3.简单项目样例:

    sublime打开项目文件夹

    按以下结构新建项目文件:

    ├── dist         ---打包后的目标文件存放目录
    ├── node_modules ---webpack本地安装的目录
    ├── package.json ---项目配置文件,是一个标准的npm说明文件
    ├── webpack.config.js ---webpack配置文件
    └── src 
    └── app.js ---源码存放目录
    webpack.config.js需要自己新建,内容类似于:  

    module.exports = {
    entry:'./src/app.js',
    output:{
    filename:'app.bundle.js'
    }
    }


    entry是源文件,需要指定目录,output是打包后的文件,打包后的文件会自动放到dist里,不需要指定目录

     进入项目,执行命令:

     webpack

     完成打包

    webpack --watch:源文件改变后不需要重新打包,目标文件会自动改变

    webpack -d:测试版,不会压缩js,加入调试信息可以方便在浏览器调试(调试的时候可以自动关联到源码,可以在源码里断点调试) 默认情况下不带参数会生成生产版,生成版会压缩

    我们可以把webpack命令集成到package.json里面,这样就可以用npm命令来执行打包(一般推荐这么做)

    在package.json的scripts模块里加入webpack命令的配置:

    "scripts": {
        "dev": "webpack -d --watch",
        "prod": "webpack"
      },

    执行npm run dev---打包生产调试版

    执行npm run prod---打包生产版

     4.项目样例2:

    在项目中创建两个文件夹,app文件夹和public文件夹(跟之前的src和dist一样),app文件夹用来存放原始数据和我们将写的JavaScript模块,public文件夹用来存放之后供浏览器读取的文件(包括使用webpack打包生成的js文件以及一个index.html文件)。接下来我们再创建三个文件:

    • index.html --放在public文件夹中;
    • Greeter.js-- 放在app文件夹中;
    • main.js-- 放在app文件夹中;

    此时项目结构如下图所示


     
    项目结构

    我们在index.html文件中写入最基础的html代码,它在这里目的在于引入打包后的js文件(这里我们先把之后打包后的js文件命名为bundle.js,之后我们还会详细讲述)。

    <!-- index.html -->
    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="utf-8">
        <title>Webpack Sample Project</title>
      </head>
      <body>
        <div id='root'>
        </div>
        <script src="bundle.js"></script>
      </body>
    </html>
    

    我们在Greeter.js中定义一个返回包含问候信息的html元素的函数,并依据CommonJS规范导出这个函数为一个模块:

    // Greeter.js
    module.exports = function() {
      var greet = document.createElement('div');
      greet.textContent = "Hi there and greetings!";
      return greet;
    };
    

    main.js文件中我们写入下述代码,用以把Greeter模块返回的节点插入页面。

    //main.js 
    const greeter = require('./Greeter.js');
    document.querySelector("#root").appendChild(greeter());
    webpack.config.js:
    module.exports = {
      entry:  __dirname + "/app/main.js",
      output: {
        path: __dirname + "/public",//打包后的文件存放的地方
        filename: "bundle.js"//打包后输出文件的文件名
      }
    }

    注:“__dirname”是node.js中的一个全局变量,它指向当前执行脚本所在的目录。
     
    package.json:
    {
      "name": "app6",
      "version": "1.0.0",
      "description": "",
      "main": "index.js",
      "dependencies": {
        "webpack-cli": "^3.2.3",
        "webpack": "^4.29.5"
      },
      "devDependencies": {},
      "scripts": {
        "start": "webpack",
        "debug":"webpack -d"
      },
      "keywords": [],
      "author": "",
      "license": "ISC"
    }

    start命令可以之前用npm start(也可以npm run start),其他命令必须是npm run xxx,比如npm run debug

     5.html-webpack-plugin插件

    前面的例子中, index.html 文件太死了,连 js 文件都写死了,有时候引用的 js 文件是动态变化的呢?

    打个比方,类似下面这种例子:

    <script src="app.bundle1.js"></script>
    <script src="app.bundle2.js"></script>
    <script src="app.bundle3.js"></script>

    而且还不确定有多少个。

    还有一种情况,有时候为了更好的 cache 处理,文件名还带着 hash,例如下面这样:

    main.9046fe2bf8166cbe16d7.js

    这个 hash 是文件的 md5 值,随着文件的内容而变化,你总不能每变化一次,就改一下 index.html 文件吧?

    效率太低!

    下面我们要使用一个 webpack 的插件 html-webpack-plugin  来更好的处理这个问题。

    webpack 吸引人的地方就是因为它有太多的插件,有时候一些需求,一个插件就搞定。

    安装html-webpack-plugin插件:

    npm install html-webpack-plugin --save-dev 

    安装成功后,package.json 这个文件会多出一行 "html-webpack-plugin": "^x.xx.x",,如下所示:

    {
      "name": "hello-wepback",
      "version": "1.0.0",
      "description": "",
      "main": "index.js",
      "scripts": {
        "dev": "webpack -d --watch",
        "prod": "webpack -p"
      },
      "author": "",
      "license": "ISC",
      "devDependencies": {
        "html-webpack-plugin": "^2.30.1",
        "webpack": "^3.8.1"
      }
    }
    也可以反向操作,先配置好devDependencies,然后在工程目录执行:
    npm install
    这样可以批量安装devDependencies里所有配置的依赖

    现在我们把第一个例子中生成的 index.html 先删除掉,我们要用 html-webpack-plugin 这个插件来自动生成它。

     webpack.config.js 文件改一下,如下所示:

    
    
    var HtmlWebpackPlugin = require('html-webpack-plugin');
    
    module.exports = {
      entry: './src/app.js',
      output: {
        path: __dirname + '/dist',
        filename: 'app.bundle.js'
      },
      plugins: [new HtmlWebpackPlugin()]
    };
     然后运行
    npm run start
    就会自动生成index.html
    <html>
      <head>
        <meta charset="UTF-8">
        <title>Webpack App</title>
      </head>
      <body>
      <script type="text/javascript" src="app.bundle.js"></script></body>
    </html>

    跟手动写的一样

    连标题 <title>Webpack App</title> 都自动生成了,如果这是固定的话,就不太灵活,但是 html-webpack-plugin 有选项来处理这个问题。

    要改变 title 很简单,上文提到 HtmlWebpackPlugin 这个方法可以传入很多参数的,下面这样就可以解决这个问题。

    var HtmlWebpackPlugin = require('html-webpack-plugin');
    
    module.exports = {
      entry: './src/app.js',
      output: {
        path: __dirname + '/dist',
        filename: 'app.bundle.js'
      },
      plugins: [new HtmlWebpackPlugin({
        title: "hello world"
      })]
    };

    只是改变了一点点东西,其实也没多大用处,有时候我们要让 index.html 根据我们的意愿来生成。就是说它的内容是我们自己定的。

    这个就不得不提到 html-webpack-plugin 的 template 功能。

     webpack.config.js 更改如下:

    var HtmlWebpackPlugin = require('html-webpack-plugin');
    
    module.exports = {
      entry: './src/app.js',
      output: {
        path: __dirname + '/dist',
        filename: 'app.bundle.js'
      },
      plugins: [new HtmlWebpackPlugin({
        template: './src/index.html',
      })]
    };

    接着新建 src/index.html 文件,内容如下:

    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <title>Hello World</title>
    </head>
    <body>
    </body>
    </html>

    我们再来看看新生成的 dist/index.html 文件,内容如下:

    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <title>Hello World</title>
    </head>
    <body>
    <script type="text/javascript" src="app.bundle.js"></script></body>
    </html>

    下面我再来介绍几个参数,以及它的结果。

    filename: 'index.html' 默认情况下生成的 html 文件叫 index.html,但有时候你不想叫这个名字,可以改。

      minify: {
          collapseWhitespace: true,
        },

    这个可以把生成的 index.html 文件的内容的没用空格去掉,减少空间。(默认是true,可以改成false,这样就会按正常的格式生成html)

    hash: true 为了更好的 cache,可以在文件名后加个 hash。

    效果如下:

    <!DOCTYPE html>
    <html>
      <head>
        <meta charset="utf-8">
        <title>Webpack App</title>
      <meta name="viewport" content="width=device-width,initial-scale=1"></head>
      <body>
      <script src="bundle.js?4abc2d79d055a2c3cf3f"></script></body>
    </html>

    最终的配置文件可能如下:

    var HtmlWebpackPlugin = require('html-webpack-plugin');
    
    module.exports = {
      entry: './src/app.js',
      output: {
        path: __dirname + '/dist',
        filename: 'app.bundle.js'
      },
      plugins: [new HtmlWebpackPlugin({
        template: './src/index.html',
        filename: 'index.html',
        minify: {
          collapseWhitespace: true,
        },
        hash: true,
      })]
    };
  • 相关阅读:
    Installshield制作安装程序
    vista以上系统中开发的程序以管理员权限运行
    检查当前系统版本是否为Vista或更高的版本
    在程序运行过程中调用另一个程序
    Spin Control(旋转按钮控件、上下微调按钮控件)
    因改变工具栏图标导致菜单栏高度随之变大的解决方案
    Unicode环境下的字符差异
    注册表API
    文件的读写操作
    const char* 和 char* const
  • 原文地址:https://www.cnblogs.com/cowboybusy/p/9533481.html
Copyright © 2020-2023  润新知