65.9K
CodeProject 正在变化。 阅读更多。
Home

关于使用 webpack 将旧式 JavaScript 库导入到 ES6 / ES11 项目中的技巧

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2020 年 7 月 14 日

CPOL

3分钟阅读

viewsIcon

10064

downloadIcon

55

将 jQuery UI 库导入到 ES6 项目

引言

一些使用早期版本 JavaScript 编写的 JavaScript 库,例如 ES5,可能由于内部定义的全局函数而与 ES6 和 webpack 不兼容。

背景

此技巧涉及将 js 库导入到具有 webpack 的 ES6 / ES11 项目中。导入 ES5 或更旧的库时可能出现的问题是全局函数不可用。

Using the Code

例如,在 ES6 / ES11 项目中使用 webpack 引用 jQuery-UI 库时,全局函数将变得不可用。 要解决此问题,唯一正确的方法是定义一个单独的模块,并在其中复制全局函数,然后在其他地方导入该模块。 以下是一些需要在单独模块中重写的全局函数:Sine、Circ、Elastic、Back、Bounce 等。

为了引用 jQueryUI,有一个特定的软件包可用:webpack-jquery-ui,它允许简单地集成到具有 webpack 的应用程序中。

$ npm i --save 'jquery' 'webpack-jquery-ui' 'gsap'

然后在 JavaScript 文件中可以轻松地包含 jQuery 和 jQueryUI,如下所示

import './app.css'

import {TweenMax} from 'gsap'

import {Sine, Circ, Elastic, Back, Bounce} from './modules/jquery-ui-es6-migrations'

import $ from 'jquery';

import 'webpack-jquery-ui'

import 'webpack-jquery-ui/css'

window.$ = window.jQuery = $;

迁移后的 js 代码模块/modules/jquery-ui-es6-migrations.js看起来像这样

const Sine = (p) => {

  return 1 - Math.cos( p * Math.PI / 2 )

}

const Circ = (p) => {

  return 1 - Math.sqrt( 1 - p * p )

}

const Elastic = (p) => {

  return p === 0 || p === 1 ? p : -Math.pow( 2, 8 * ( p - 1 ) ) * 
                    Math.sin( ( ( p - 1 ) * 80 - 7.5 ) * Math.PI / 15 )

}

const Back = (p) => {

  return p * p * ( 3 * p - 2 );

}

const Bounce = (p) => {

  var pow2,

  bounce = 4

  while ( p < ( ( pow2 = Math.pow( 2, --bounce ) ) - 1 ) / 11 ) {}

  return 1 / Math.pow( 4, 3 - bounce ) - 7.5625 * Math.pow( ( pow2 * 3 - 2 ) / 22 - p, 2 )

}

export {Sine, Circ, Elastic, Back, Bounce}

为了将 jQuery 与 webpack 一起使用 - 它需要在webpack.config.js文件中提供相应的插件

module.exports = {

...

  plugins: [

  ...

  new webpack.ProvidePlugin({

    $: 'jquery',

    jQuery: 'jquery',

    JQuery: 'jquery',

    jquery: 'jquery',

    'windows.jQuery': 'jquery',

  }),

....]

};

尽管如此,为了加载 jQueryUI 样式和图像,必须将特定的加载器添加到webpack.config.js模块规则中:file-loaderstyle-loadercss-loader

$ npm i --save 'file-loader' 'style-loader' 'css-loader'
module: {

  rules: [

  {

    test: /\.css$/,

    loaders: ["style-loader","css-loader"]

  },

  {

    test: /\.(jpe?g|png|gif)$/i,

    loader:"file-loader",

    options:{

      name:'[name].[ext]',

      outputPath:'assets/images/'
    }

  },

....

  ]

},

就是这样。 具有从模块导入的已定义静态函数的 jQueryUI 可以安全使用。 以下是用于动画容器的迁移静态函数的示例用法

function expandContainer() {

  const $container = $("#tabs")

  const current_height = $("#tabs").outerHeight()

  const props_from = {

    opacity: .2,

    height: 0,

    top: -20

  },

  props_to = {

    height: current_height,

    opacity: 1,

    top: 0

  }

  TweenMax.set($container, {css: props_from})

  TweenMax.to($container, 0.25, 
           {css: props_to, ease: Sine.easeInOut, onUpdate: null, onComplete() {

    $container.addClass('visible').height('')

    $container.attr('style', '')

  }});

}
function collapseContainer() {

  const $container = $("#tabs")

  TweenMax.to($container, 0.25, {css: {height: 0, opacity: .2}, 
              ease: Sine.easeInOut, onUpdate: null, onComplete()   {

    $container.removeClass('visible')

  }});

}

附加的源代码包含可用的版本,其中包含用于动画目的的导入函数。

关注点

什么是 Webpack? 为什么 Web 开发人员需要它? Webpack 将所有 JavaScript 源代码文件捆绑(类似于编译过程)到一个捆绑包(js 文件)中。 它还会监视 JavaScript 文件更改,并在代码更改时自动重新构建或捆绑项目。 它还会自动重新加载/刷新网页。 这是一个非常方便的工具,它在编码过程中完成所有例行的控制台作业。 例如,修改任何 js 文件,保存它 - 并且它会立即、即时地反映在网页上。 JavaScript 代码被转换、组合成一个文件,浏览器页面由 webpack 在后台刷新。

Babel 用于什么? Babel 通过将现代、最新的 JavaScript ES6 或 ES11 (2020) 转换为广泛支持的 ES5(所有现代浏览器都支持)来启用许多浏览器尚未支持的最新 JavaScript 功能。 因此,开发人员可以在编码时使用最新的 JavaScript ES11 功能,然后 Babel 将其转换为 ES5 - 以便在所有现代浏览器中执行(因为 ES11 本身是一个标准,并且尚未被现代浏览器支持)。

Babel 通过 babel-loader 插件集成到 webpack 中。

npm install --save 'babel-loader'

webpack.config.js

module.exports = {

...

module: {

rules: [

        {

           test: /\.js$/,

           exclude: /node_modules/,

           use: {

              loader: "babel-loader",

              options: {

                 presets: ["@babel/preset-env"]

              }

           }

        }

......
      ]
}
}

此处描述的示例发布在 codesendbox 上,但它需要修复。

有用资源

历史

  • 2020 年 7 月 13 日:初始版本
  • 2020 年 7 月 14 日:添加了用于动画目的的导入函数的示例用法
© . All rights reserved.