js整理(8)

149 阅读14分钟

NodeJs

NodeJs = JavaScript执行环境+JavaScript扩展的功能。
一个可以运行JavaScript的平台,基于Chrome JavaScript V8引擎,并且对ECMAScript语言进行了增强,使ECMAScript具有服务器语言开发的能力(操作文件,读取系统信息,网络等。。。);
简单理解NodeJs就是一个可以让JavaScript脱离浏览器还能执行的平台,并且这个平台对JavaScript功能进行了增强。
(1)下载NodeJs 中文地址:nodejs.cn/download/
(2)DOS命令
DOS命令是windows系统中自带的命令行操作系统.进入命令行: win+R 在运行框中输入 cmd 再回车

e:	切换盘符(切换到E盘)
		e:
	cd	进入指定的文件夹
		cd 文件夹名	进入指定的目录
		cd ./		进入当前目录(省略不写)
		cd ../		进入上一级目录
		cd /		进入根目录
		
	dir	显示当前文件夹中的文件和目录列表
	cls	清除屏幕
	ctrl+c 中断执行	
	

命令行的两种模式

第一种: DOS系统模式 , 只能够运行DOS命令
(c:    cd    dir    cls ...)
标识:  C:\user\administrator
第二种: node模式: 只能运行JS代码
标识: >
从 DOS模式切换到 Node模式:
命令: node  回车
从Node模式切换到DOS模式:
命令: .exit
快捷键: ctrl+c 按多次
(一)客户端编程语言和服务器编程语言

客户端编程语言是运行在客户端浏览器里面。 例如:html,css, javascript
服务器编程语言是运行在服务器上。 例如:java php .net nodejs

(二)NodeJs与JavaScript区别

NodeJs :一个可以运行JavaScript的平台,基于Chrome JavaScript V8引擎,并且对ECMAScript语言进行了增强,使ECMAScript具有服务器语言开发的能力(操作文件,读取系统信息,网络等。。。); JavaScript:一门编程语言,只要有ECMAScript引擎就能运行,各大浏览器都有自己的JavaScript引擎,并且如果ECMAScript运行在浏览器中,浏览器对ECMAScript加入了浏览器和文档操作的接口(方法);
简单理解:JavaScript运行需要JavaScript引擎,JavaScript引擎可以在浏览器(IE、Firefox、Chrome)中,也可以独立出来(NodeJs),运行在浏览器中的JavaScript,为客户端JavaScript,而NodeJs称为服务端JavaScript。 JavaScript运行在不同的平台,责任也不一样,浏览器中JavaScript主要是操作BOM和DOM,而NodeJs则是具有服务端语言处理能力(处理网络请求,保存数据到数据库);

(三)运行NodeJs

1.cmd命令行
NodeJs提供了REPL模式(cmd命令行)( Read-Evaluate-Print-Loop,输入 -求值 -输出 -循环),即交互式命令行解析器),可以直接在命令行,编写NodeJs代码,适合检验和学习nodejs。
(1)win键(田字符)+R(运行命令框),输入cmd //打开终端
(2)输入:node+回车; //切换node模式
(3)输入:js代码+回车,查询运行效果; //执行js代码
2.js文件方式
(1)新建一个js文件,然后编写简单的js代码
(2)命令行运行
//首先让命令行导向到执行文件的目录下面 //node js文件名

(四)NodeJs模块基础

NodeJs采用模块方式来管理和组织代码,NodeJs的所有的功能都存在每个模块中。
模块:一个具有特定功能的文件就是一个模块,模块之间可能存在一定的依赖关系,使用模块可以很好的把这些依赖关系整合起来。
有了模块,我们就可以非常方便的使用这些模块,因为模块总是完成了特定功能,如果需要修改模块中的功能,那么需要修改这个自己的模块文件即可,模块独立与每一个文件中,不影响模块的代码。 JS中的模块有共性,模块的功能代码都是在一个函数中。 1、模块中定义变量都是局部变量。 2、模块定义在函数,也是局部。 3、模块有一个模块对象。包含moduleId(模块名)、exports(导出对象) 4、如果模块中需要暴露方法或属性给外部使用,那么就执行往exports对象上面添加。 5、使用一个模块用require(“moduleId”),该方法返回的是模块对象的exports对象。 var a = require(“./a.js”); a.xxx // 等同于模块中exports.xxx.

(五)自定义模块

一个JS文件就是一个模块,所以定义一个模块,只需要新建一个JS文件即可。

//a.js
let a=1
function fun() {
    console.log("fun");
}

//非常重要,导出模块功能(供外部使用)
exports.a=a
exports.fun=fun

//第二种写法
let a=1
function fun() {
    console.log("fun");
}
module.exports={
    a,
    fun
}

虽然我们在js定义了两个方法,但是这个两个方法只能在当前模块中使用,因为模块是独立的(内部的变量和函数只能在该模块使用),所以我们可以使用模块内的exports对象(导出对象)输出模块中功能供外部使用.
一个模块,一旦定义完成后,我们就可以使用这些模块。首先,你需要编写一个新的文件(模块),来使用a.js模块。使用模块,通过require(“模块”)

//b.js
let a=require("./a")
a.fun()
console.log(a.a);
输出:fun;1

一个文件就是一个模块,编写这个模块中的代码,实际上都写在一个函数中,这样就保证了局部变量,模块独立,不会对外部模块造成影响。

functionexportsrequiremodule,__filename,__dirname){
    let a=1
    function fun() {
        console.log("fun");
    }
    exports.a=a
    exports.fun=fun
}
require函数

require(moduleId)函数用于在当前模块中加载和使用别的模块,传入一个模块名,返回一个模块导出对象。
.是相对于当前目录,模块文件路径的js后缀可以省略
被引入的模块分为三种:文件模块第三方模块 系统模块
注意: 1)引入模块文件有语法错误时会报错 2)引入模块不存在时会报错 3)重复引入模块只执行一次 4)在require函数引入模块时,可以省略扩展名 .js .json .node 不写。

exports导出对象

exports对象是当前模块的导出对象,用于导出模块公有方法和属性。别的模 块通过require函数使用当前模块时得到的就是当前模块的exports对象。
注意: 1)exports 等同于 module.exports
2)exports是一个对象,可以对它添加属性和方法

module模块对象

module对象可以访问到当前模块的一些相关信息,但最多的用途是替换。当前模块的导出对象(module.exports={})。模块导出对象默认是一个普通对象。

exports和module.exports的区别

exports仅仅是引用了module.exports. 但是真正暴露的对象为module.exports对象

模块初始化

一个模块中的JS代码仅在模块第一次被使用时执行一次,并在执行过程中初始 化模块的(exports)导出对象。之后,缓存起来的导出对象被重复利用。

模块导入

(1)核心模块 核心模块,是由NodeJs平台提供的模块,也可以称为“系统模块”。
导入核心模块的规则:不以..或.和/开始的标识符。
(2)文件模块 以..或.和/开始的标识符,这里都被当做文件模块来处理。let hello = require(“./hello”);

node_modules文件夹

node_modules文件夹在nodejs中是一个特殊的文件夹,通过它的名字就可以看出,该文件夹也是用于存放node模块。 如果一个模块不是一个系统模块,也不是一个文件模块,那么就会在node_modules文件夹下进行操作。
console.log(module.paths);//node_modules会查找的目录。

[
  'C:\\Users\\Administrator\\Desktop\\新建文件夹\\node_modules',
  'C:\\Users\\Administrator\\Desktop\\node_modules',
  'C:\\Users\\Administrator\\node_modules',
  'C:\\Users\\node_modules',
  'C:\\node_modules'
]
当前文件目录下的node_modules目录。
父目录下的node_modules目录。
父目录的父目录下的node_modules目录。
沿路径向上逐级递归,直到根目录下的node_modules目录。
环境变量配置的全局模块目录中。

模块后缀名
require()在分析标识符的过程中,会出现标识符中不包含文件扩展名的情况。CommonJS模规范也允许在标识符中不包含文件扩展名,这种情况下,Node会按js、json、node的次序补足扩展名,依次尝试。 简单理解:如果模块的后缀名为js、json、node那么可以不写。

JS模块的基本单位是单个JS文件,但复杂些的模块往往由多个子模块组成。为了便于管理和使用,我们可以把由多个子模块组成的大模块称做包,并把所有子模块放在同一个目录里。
组成一个包的所有子模块中,需要有一个入口模块,入口模块的导出对象被作为包的导出对象。 默认包中的入口模块为index.js,也可以在包中新建一个package.json包描述文件,设置main属性值为模块的入口。

package.json
{
  main:”./hello.js//模块的入口
}
Package.json 属性说明
    name - 包名。
    version - 包的版本号。
    description - 包的描述。
    homepage - 包的官网 url 。
    author - 包的作者姓名。
    contributors - 包的其他贡献者姓名。
    dependencies - 依赖包列表。如果依赖包没有安装,npm 会自动将依赖包安装在 node_module 目录下。(模块也会依赖其他模块。)
    repository - 包代码存放的地方的类型,可以是 git 或 svn,git 可在 Github 上(代码仓库 , git,svn版本控制工具)。
    main - main 字段是一个模块ID,它是一个指向你程序的主要项目。就是说,如果你包的名字叫 express,然后用户安装它,然后require("express")。
    keywords - 关键字,发布到npm后,供其他人搜索
创建包描述文件的命令

npm init 命令,帮助我们创建一个package.json

NPM

Npm(Node Package Manager): Node包(模块)管理工具,借助NPM,可以帮助用户快速安装和管理依赖包,这样我们就可以很方便的使用来自全球Node开发者提供的包了。
npm 安装 Node.js 模块语法格式如下: npm install
Npm 常用命令

    1)npm init     生成package.json文件
    2)npm i 包名   下载安装包     下载包并保存到运行依赖 
    3)npm i 包名 -S | --save      下载包并保存到运行依赖
    4)npm i 包名 -D | --save-dev      下载包并保存到开发依赖
    5)npm i 包名 -g | -global      全局安装,安装的是命令
    6)npm view 包名 versions   查看包所有的版本信息
    如果安装固定版本的包 npm i 包名@版本号
CNPM
CNPM是taobao提供的一个完整 npmjs.org 镜像,cnpm与npm的内容每10分钟会同步一次。
安装cnpm:
npm install -g cnpm --registry=https://registry.npm.taobao.org
使用cnpm:
cnpm install <模块名>

Webpack

webpack是一个现代 JavaScript 应用程序的静态模块打包器(module bundler),是一种前端资源构建工具,在webpack看来,前端所有资源文件(js、json、css、img、less、typeScript、等等】)都会作为模块处理。它将根据模块的依赖关系进行静态分析,打包生成对应的静态资源(bundle)。当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个 bundle。

webpack的5个核心概念

Entry

入口起点(entry point)指示 webpack 应该使用哪个模块,来作为构建其内部依赖图的开始。可以通过在 webpack 配置中配置 entry 属性,来指定一个入口起点(或多个入口起点)

Output

output 属性告诉 webpack 在哪里输出它所创建的 bundles,以及如何命名这些文件,默认值为 ./dist。基本上,整个应用程序结构,都会被编译到你指定的输出路径的文件夹中。

Loader

loader 让 webpack 能够去处理那些非 JavaScript 文件(webpack 自身只理解 JavaScript)。loader 可以将所有类型的文件转换为 webpack 能够处理的有效模块,然后你就可以利用 webpack 的打包能力,对它们进行处理。

Plugins

loader 被用于转换某些类型的模块,而插件则可以用于执行范围更广的任务。插件的范围包括,从打包优化和压缩,一直到重新定义环境中的变量。插件接口功能极其强大,可以用来处理各种各样的任务。

Mode

通过选择 development 或 production 之中的一个,来设置 mode 参数,你可以启用相应模式下的 webpack 内置的优化

选项选项
development会将 process.env.NODE_ENV 的值设为 development。启用 NamedChunksPlugin 和 NamedModulesPlugin。代码本地调试环境
production会将 process.env.NODE_ENV 的值设为 production。启用 FlagDependencyUsagePlugin, FlagIncludedChunksPlugin, ModuleConcatenationPlugin, NoEmitOnErrorsPlugin, OccurrenceOrderPlugin, SideEffectsFlagPlugin 和 UglifyJsPlugin。优化线上环境。

webpack使用步骤

    安装步骤
    1)创建项目文件夹,初始化生成 package.json
    yarn init    // 创建 package.json
    2)本地安装 webpack 和 webpack-cli
    yarn add webpack@5.12.1 webpack-cli@4.3.1 -D  // 本地安装
    
    使用步骤
    1)在项目根目录创建 webpack.config.js文件。
    2)项目根目录创建src文件夹,里面创建文件 index.html 和 index.js3)从当前目录进入终端,执行如下打包命令,此打包命令会自动找到 webpack.config.js 配置文件,按照里面的配置打包
    npx webpack  // 打包完成 会在dist目录中生成打包后的文件
    4Webpack.config.js 文件配置如下
      /* 
      webpack配置
    */

    const path = require('path'// 引入node内置模块path 处理文件路径

    module.exports = {
      // 入口
      entry'./src/index.js',
      // 出口
      output: {
        path: path.resolve(__dirname, 'dist'), // 输出目录
        filename'bundle.js' // 输出文件名
      },
      // 模式: development: 开发模式  production: 生产模式
      mode'development'
    }  
    5)在 index.html中,引入打包后的结果 bundle.js, 浏览器打开index.html开效果

核心loader

loader 让 webpack 能够去处理那些非 JavaScript 文件(webpack 自身只理解 JavaScript)。loader 可以将所有类型的文件转换为 webpack 能够处理的有效模块。
(一)加载css
1)下载对应的loader

    yarn add style-loader css-loader -D

2)配置loader

    // loader配置
  module: {
    rules: [
      {
        test/\.css$/,  // 匹配所有.css文件
        use: [
          'style-loader'// 创建style标签 把css插入html的head内
          'css-loader' // 解析加载css到js中(把css打成字符串)。
        ]
      }
    ]
  }

(二) 加载less
1)下载对应的loader

     yarn add less-loader less -D  // style-loader css-loader 前面处理css下载过了

2)配置loader

    // loader配置
  module: {
    rules: [
      {
        test/\.less$/,  // 匹配所有.less文件
        use: [
          'style-loader'// 创建style标签 把css插入html的head内
          'css-loader'// 解析加载css到js中(把css打成字符串)。
          'less-loader'// 编译less为css
        ]
      }
    ]
  }

(三)加载img
1.在css中加载img
1)下载对应loader

    yarn add url-loader file-loader -D

2)配置loader

     // loader配置
  module: {
    rules: [
      {
        test/\.(jpg|png|gif)$/,
        loader'url-loader',
        options: {
          name'[hash:16].[ext]',  // 图片输出的名字hash长度16位 默认32位
          limit10 * 1024,  // 小于10kb base64处理
          // 关闭url-loader的es Module  使用commonjs module解析 , url-loader默认使用es6模块化解析 而后续使用 html-loader 引入图片是 commonjs解析  不关闭会报错
          esModulefalse, 
        }
      }
    ]
  }

2.在html中加载img
1)下载对应loader 和 处理html的插件

    yarn add html-loader html-webpack-plugin@4.5.0 -D

2)配置loader

 const HtmlWebpackPlugin = require('html-webpack-plugin'// 处理html的插件
// loader配置
  module: {
    rules: [
      {
        test/\.html$/, // 处理html中引入img
        loader'html-loader'
      },
    ]
  }

3)配置插件

     plugins: [
    // 处理html
    new HtmlWebpackPlugin({
      template'./src/index.html'  // 把index.html复制到dist中 自动引入资源文件
    })
  ]

(四)加载字体图标
1)下载对应loader

    yarn add file-loader -D

2)配置loader

    
{
     test/\.(eot|svg|ttf|woff|woff2)$/,  // 处理字体格式文件
     loader'file-loader',
     options: {
          name'[hash:16].[ext]', // 输出名字
          outputPath'fonts' // 输出路径
     }
}

(五)编译es6到es5
1)下载对应依赖模块

    yarn add babel-core babel-loader@7.1.5 babel-preset-es2015 -D

2)配置loader

    {

        test/\.js$/,
        loader'babel-loader',    // loader 编译es6为es5
        exclude/node_modules/  // 排除
  }

3)在项目根目录 创建 .babelrc 文件, 内容如下。

    {
      "presets": [
          "es2015"
      ]
    }

插件plugins

1)下载

    yarn add 插件名 -D

2)引入

    const 变量 = require(‘插件名’)

3)使用配置

    // 处理html的插件
const HtmlWebpackPlugin = require('html-webpack-plugin'// 提取css
const MiniCssExtractPlugin = require('mini-css-extract-plugin'// 压缩css
const OptimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin'// 配置
plugins: [
     // 处理html  把index.html复制到dist中 自动引入资源文件
    new HtmlWebpackPlugin({
        template'./src/index.html',   
        // 压缩html     
        minify: {
            // 移除空格
            collapseWhitespacetrue,
            // 移除注释
            removeCommentstrue
          }
    }),
    new MiniCssExtractPlugin({ // 提取css
      filename'css/[name].css' // 重命名输出的css
    }),
    new OptimizeCssAssetsWebpackPlugin() // 压缩css
  ]
开发服务器devServer

1)局部安装

    yarn add webpack-dev-server@3.11.1 -D

2)配置

     // 开发服务器
  devServer: {
    contentBase: path.resolve(__dirname, 'dist'), // 启动服务器目录
    compresstrue// 启动gzip
    port666,  // 端口
    opentrue// 自动打开服务
    publicPath: ‘/’
  }

3)启动

    npx webpack serve

完整例子

    /**
 * webpack配置
 */

const path = require('path'// node内置处理路径的模块
const HtmlWebpackPlugin = require('html-webpack-plugin'// 打包html的插件
const MiniCssExtractPlugin = require('mini-css-extract-plugin'// 提取css插件
const OptimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin'// 压缩css

// console.log('当前环境:', process.env.NODE_ENV)

// 暴露出去
module.exports = {
  // 入口
  entry'./src/js/index.js',

  // 出口
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename'js/bundle.js',
    publicPath'./',  // 找资源 自己拼接这个路径
  },

  // 配置loader
  module: {
    rules: [
      // css
      {
        test/\.css$/,
        use: [
          {
            loaderMiniCssExtractPlugin.loader,
            options: {
              publicPath'../' // 查找静态资源路径
            }
          },
          'css-loader',
          'postcss-loader'// 处理css兼容性
        ]
      },
      // less
      {
        test/\.less$/,
        use: [
          MiniCssExtractPlugin.loader,
          'css-loader',
          'postcss-loader'// 处理css兼容性
          'less-loader'
        ]
      },
      // css中图片
      {
        test/\.(jpg|png|gif)$/,
        loader'url-loader',
        // 对loader进行额外的配置
        options: {
          name'[hash:16].[ext]'// 输出的名字
          limit10 * 1024,  // 大小限制
          outputPath'img'// 输出路径
          esModulefalse,  // 和html引入图片的插件有冲突 必须配置这个
        }
      },
      // html中图片
      { test/\.html$/loader'html-loader' },
      // 字体图标
      {
        test/.(eot|svg|ttf|woff|woff2)$/,
        loader'file-loader',
        options: {
          name'[hash:16].[ext]'// 输出名字
          outputPath'fonts'// 输出路径
        }
      },
      // es6 -> es5
      {
        test/\.js$/,
        loader'babel-loader',
        exclude/node_modules/// 排除
      }
    ]
  },

  // 模式
  mode: process.env.NODE_ENV === 'dev' ? 'development' : 'production',

  // 插件
  plugins: [
    // 打包html
    new HtmlWebpackPlugin({
      template'./src/index.html',  // 打包的模板
      filename'index.html'// 输出的名字
    }),

    // 提取css
    new MiniCssExtractPlugin({
      filename'css/bundle.css'
    }),

    // 压缩css
    new OptimizeCssAssetsWebpackPlugin()
  ],

  // 启动开发服务器
  devServer: {
    contentBase: path.resolve(__dirname, 'dist'), // 启动服务器目录
    publicPath'/'// 服务器资源目录 
    compresstrue// 启动gzip压缩
    port8088,  // 端口
    opentrue// 自动打开浏览器
    openPage'index.html'// 指定当前要打开页面的名字
  },
}

Webpack的本质是文件的自动化处理,包含了文件的压缩、合并、混淆、文件复制、监听文件操作(增、删、改),自动刷新浏览器等功能。
Webpack是前端的静态资源打包工具,代码解析分为两个阶段,编译和运行时阶段,webpack在编译阶段就可以帮助我们打包所有静态资源。