webpack 与 模块化

webpack 与 模块化

模块化

模块化已经是现代前端开发中不可或缺的一部分了

把复杂的问题分解成相对独立的模块,这样的设计可以降低程序复杂性,提高代码的重用,也有利于团队协作开发与后期的维护和扩展

ECMAScript2015 开始引入了模块的概念,我们称为:ECMAScript Module,简称:ESM

模块化的核心

  • 独立的作用域
  • 如何导出模块内部数据
  • 如何导入外部模块数据

ESM

ECMAScript2015/ECMAScript6 开始,JavaScript 原生引入了模块概念,而且现在主流浏览器也都有了很好的支持

独立模块作用域

一个文件就是模块,拥有独立的作用域,且导出的模块都自动处于 严格模式下,即:'use strict'

导出模块内部数据

使用 export 语句导出模块内部数据

// 导出单个特性
export let name1, name2,, nameN;
export let name1 =, name2 =,, nameN;
export function FunctionName(){...}
export class ClassName {...}

// 导出列表
export { name1, name2,, nameN };

// 重命名导出
export { variable1 as name1, variable2 as name2,, nameN };

// 默认导出
export default expression;
export default function () {}
export default function name1() {}
export { name1 as default,};

// 模块重定向导出
export * from;
export { name1, name2,, nameN } from;
export { import1 as name1, import2 as name2,, nameN } from;
export { default } from;

导入外部模块数据

导入分为两种模式

  • 静态导入
  • 动态导入

静态导入

在浏览器中,import 语句只能在声明了 type="module" 的 script 的标签中使用。

import defaultExport from "module-name";
import * as name from "module-name";
import { export } from "module-name";
import { export as alias } from "module-name";
import { export1 , export2 } from "module-name";
import { foo , bar } from "module-name/path/to/specific/un-exported/file";
import { export1 , export2 as alias2 , [...] } from "module-name";
import defaultExport, { export [ , [...] ] } from "module-name";
import defaultExport, * as name from "module-name";
import "module-name";

静态导入方式不支持延迟加载,import 必须这模块的最开始

document.onclick = function () {

    // import 必须放置在当前模块最开始加载
    // import m1 from './m1.js'

    // console.log(m1);

}

动态导入

此外,还有一个类似函数的动态 import(),它不需要依赖 type="module" 的 script 标签。

关键字 import 可以像调用函数一样来动态的导入模块。以这种方式调用,将返回一个 promise

import('./m.js')
  .then(m => {
    //...
});
// 也支持 await
let m = await import('./m.js');

通过 import() 方法导入返回的数据会被包装在一个对象中,即使是 default 也是如此

模块化的向下兼容

  • CommonJS
  • AMD
  • UMD
  • ESM

无论是那种模块化规范,重点关注

  • 独立模块作用域
  • 导出模块内部数据
  • 导入外部模块数据

CommonJS

在早起前端对于模块化并没有什么规范,反而是偏向服务端的应用有更强烈的需求,CommonJS 规范就是一套偏向服务端的模块化规范,NodeJS 就采用了这个规范。

独立模块作用域

一个文件就是模块,拥有独立的作用域

导出模块内部数据

通过 module.exportsexports 对象导出模块内部数据

// a.js
let a = 1;
let b = 2;

module.exports = {
  x: a,
  y: b
}
// or
exports.x = a;
exports.y = b;

导入外部模块数据

通过 require 函数导入外部模块数据

// b.js
let a = require('./a');
a.x;
a.y;

AMD

因为 CommonJS 规范一些特性(基于文件系统,同步加载),它并不适用于浏览器端,所以另外定义了适用于浏览器端的规范

AMD(Asynchronous Module Definition)

https://github.com/amdjs/amdjs-api/wiki/AMD

浏览器并没有具体实现该规范的代码,我们可以通过一些第三方库来解决

requireJS

https://requirejs.org/

// 1.html
<script data-main="scripts/main" src="https://cdn.bootcss.com/require.js/2.3.6/require.min.js"></script>

独立模块作用域

通过一个 define 方法来定义一个模块,并通过该方法的第二个回调函数参数来产生独立作用域

// scripts/Cart.js
define(function() {
  // 模块内部代码
})

导出模块内部数据

通过 return 导出模块内部数据

// scripts/Cart.js
define(function() {
  return class Cart {
    add(item) {
      console.log(`添加商品:${item}`)
    }
  }
})

导入外部模块数据

通过前置依赖列表导入外部模块数据

// scripts/main.js
// 定义一个模块,并导入 ./Cart 模块
define(['./Cart'], function(Cart) {
  let cart = new Cart()
  cart.add({name: 'iphoneXX', price: 1000000})
})

requireJSCommonJS 风格

require.js 也支持 CommonJS 风格的语法

导出模块内部数据

// scripts/Cart.js
define(['require', 'exports', 'module'], function(require, exports, module) {
  class Cart {
    add(item) {
      console.log(`添加商品:${item}`)
    }
  }
  exports.Cart = Cart;
})
// 忽略不需要的依赖导入
define(['exports'], function(exports) {
  class Cart {
    add(item) {
      console.log(`添加商品:${item}`)
    }
  }
  exports.Cart = Cart;
})
// 如果是依赖的导入为:require, exports, module,也可以省略依赖导入声明
define(function(require, exports, module) {
  class Cart {
    add(item) {
      console.log(`添加商品:${item}`)
    }
  }
  exports.Cart = Cart;
})

导入外部模块数据

// scripts/main.js
define(['./Cart'], function(Cart) {
  let cart = new Cart()
  cart.add({name: 'iphoneXX', price: 1000000})
})

UMD

严格来说,UMD 并不属于一套模块规范,它主要用来处理 CommonJSAMDCMD 的差异兼容,是模块代码能在前面不同的模块环境下都能正常运行

(function (root, factory) {
  	if (typeof module === "object" && typeof module.exports === "object") {
        // Node, CommonJS-like
        module.exports = factory(require('jquery'));
    }
    else if (typeof define === "function" && define.amd) {
      	// AMD 模块环境下
        define(['jquery'], factory);
    }
}(this, function ($) { // $ 要导入的外部依赖模块
    $('div')
    // ...
    function b(){}
    function c(){}

    // 模块导出数据
    return {
        b: b,
        c: c
    }
}));

tsm - typescript module

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Webpack 是一个非常流行的 JavaScript 模块打包器,它可以将多个模块打包成一个或多个 bundle,并且支持各种模块类型,包括 JavaScript、CSS、LESS 等。 如果你想在 webpack 中使用 LESS,可以按照以下步骤进行配置: 1. 安装需要的依赖包: ``` npm install less less-loader css-loader style-loader --save-dev ``` 2. 在 webpack 的配置文件中添加以下 loader 配置: ```javascript module: { rules: [ { test: /\.less$/, use: [ { loader: "style-loader" }, { loader: "css-loader" }, { loader: "less-loader" } ] } ] } ``` 上述配置的含义是:首先使用 less-loader 将 LESS 文件编译为 CSS 文件,然后使用 css-loader 将 CSS 文件转换为 JavaScript 模块,最后使用 style-loader 将 JavaScript 模块中的 CSS 插入到 HTML 页面的 style 标签中。 3. 在 JavaScript 模块中导入 LESS 文件: ```javascript import './style.less'; ``` 上述代码会将 style.less 文件打包到 JavaScript 模块中,并且在 HTML 页面中自动插入对应的样式。 通过上述步骤,你就可以在 webpack 中使用 LESS 进行模块化开发了。 ### 回答2: webpack是一个前端模块化的打包工具,而less是一种动态样式语言。结合webpack和less可以实现样式的模块化。 在使用webpack进行less的模块化时,首先需要安装相关的依赖,包括`style-loader`、`css-loader`和`less-loader`。这些loader可以帮助webpack识别和加载less文件。 一般情况下,我们会在Webpack配置文件中配置loader规则,告诉webpack如何处理less文件。可以通过`rules`字段添加相应的loader,例如: ```javascript module: { rules: [ { test: /\.less$/, use: [ 'style-loader', 'css-loader', 'less-loader' ] } ] } ``` 这样webpack在打包时就会根据规则,将引入的less文件转换成CSS并插入到HTML中。 在less文件中,可以通过`@import`语句引入其他的less文件,实现样式的模块化。例如: ```less @import 'variables.less'; @import 'mixins.less'; body { background-color: @primary-color; color: @secondary-color; } ``` 通过这种方式,可以将样式按照功能或组件进行拆分,使得代码更加结构化和可维护。 总而言之,webpack和less可以很好地结合,实现前端代码的模块化。使用webpack进行打包和加载模块,再结合less进行样式的模块化,可以提高开发效率和代码的可维护性。 ### 回答3: webpack是一个用于打包前端资源的工具,而LESS是一种预编译CSS的语言。它们可以通过配置实现模块化。 在webpack的配置文件中,我们可以使用相应的loader来处理LESS文件。通过配置loader,webpack可以将LESS文件转换成CSS文件。同时,我们可以将CSS文件模块化地引入到我们的项目中。 在使用LESS时,我们可以将样式拆分为多个模块,每个模块包含特定的样式规则。这样做的好处是能够提高代码的可维护性和重用性。通过使用@import语句,我们可以将多个LESS文件导入到主文件中,这样所有的样式规则都会被打包到一个CSS文件中。 在webpack配置文件中,我们可以使用LESS loader来转换LESS文件为CSS文件,并通过style loader将CSS插入到HTML中。通过配置extract-text-webpack-plugin插件,我们还可以将CSS提取为单独的文件,而不是将其嵌入到HTML中。 另外,使用webpack模块化功能,我们可以通过配置alias,将指定的导入路径映射为真实路径。这样,在导入LESS文件中的模块时,我们只需要通过相对路径来引用它们,而不需要关心真实路径。 总结而言,通过webpack和LESS的配置,我们可以实现前端资源的模块化。这种模块化的设计可以提高项目的可维护性和重用性,同时也方便了开发者的工作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值