プログラミング要素javascriptの - コード変更コード

プログラミング要素javascriptの - コード変更コード

入門

リファクタリングコードは、特に再構成プログラムを決定する際に、手作業であり、残りはプログラムコードによって調整し、それをテストしています。

どのように簡単なことではない場所のコードでは良いと高速調整を、持っています。

コードは、無力に示す正規表現やや複雑である場合、単純なコードは、示された正規表現のために使用することができます。

私は、以前の修正方法での話のようmethod_missingのjavascriptのメタプログラミングは、インターフェイスを50回、それを変更したい場合は、私は、プロジェクトで変更することができますか?私は、この再構成が価値があると考えるために持っています。

私は、任意のコードが書けるようにすることはできません。

だから私が見つかりました。jscodeshiftをので、私は私のツールリファクタリングコードを使用することができます。

jscodeshiftは私がツールソースのオペレーティングコードを持ってみましょう。

実現

私は私が呼び出しをmethod_missingに調整され、プロジェクト(URLで)呼び出しをインターフェイスにしたい、私の最後の記事でmethod_missing項目の例を使用します。

次のように:


// old
$.ajax('/api/web/project/content/target/mod', {
  type: 'post',
  dataType: 'json',
  data: {
    tid: it.targetId,
    targetImgId: img.objectId,
    pid: pid
  }
}).done(function (data, status, jqXhr) {
  self.hideLoading();
  if (data && data.code === 200 && data.data) {
    it.target = data.data
    // self.paginationConf.onChange()
  }
}).fail(() => {

}).always(() => {

})

// new
this.$api.update_project_content_target_mod({
    tid: it.targetId,
    targetImgId: img.objectId,
    pid: pid
}).then(function (data, status, jqXhr) {
  self.hideLoading();
  if (data && data.code === 200 && data.data) {
    it.target = data.data
    // self.paginationConf.onChange()
  }
}).catch(() => {

}).finally(() => {

})

新しいコードに見ることができるように、古いコード$アヤックスは、この。$ APIを交換し、その後、メソッド名パラメータへの呼び出しを生成します。

最後に、パラメータの数を調整するだけでなく、パラメータの値を調整します。

定期的に作成する方法を考えてみて?

定期的には、何もしないはずです。

プレイするjscodeshiftその後、それはASTにコードを解析することができ、その後、私たちはコードに続いAST、ASTを変更します。

次のように私のコードは次のとおりです。


const adapt = require('vue-jscodeshift-adapter');

// 修改 $.ajax
function transform(fileInfo, api) {
  const j = api.jscodeshift

  return j(fileInfo.source)
    .find(j.CallExpression, { callee: { object: { name: '$' }, property: { name: 'ajax' } } })
    .replaceWith(p => {
      const url = p.node.arguments[0]
      const setting = p.node.arguments[1]
      const urlStr = url.value.replace('/api/web/', '').split('/')
      let method = 'get'
      let newSetting

      setting.properties.forEach(i => {
        if (i.key.name.toLowerCase() === 'type') {
          if (i.value.value.toLowerCase() === 'post') {
            method = 'update'
          }
        } else if (i.key.name.toLowerCase() === 'data') {
          newSetting = i.value
        }
      });

      urlStr.unshift(method);

      return j.callExpression(
        j.memberExpression(
          j.memberExpression(j.identifier('this'), j.identifier('$api'), false),
          j.identifier(urlStr.join('_')), false
        ), [newSetting])
    })
    .toSource();
}

// 修改 done
function transform1(fileInfo, api) {
  const j = api.jscodeshift

  return j(fileInfo.source)
    .find(j.MemberExpression, { property: { name: 'done' } })
    .replaceWith(p => {
      p.node.property.name = 'then'
      return p.node
    })
    .toSource();
}

// 修改 fail
function transform2(fileInfo, api) {
  const j = api.jscodeshift

  return j(fileInfo.source)
    .find(j.MemberExpression, { property: { name: 'fail' } })
    .replaceWith(p => {
      p.node.property.name = 'catch'
      return p.node
    })
    .toSource();
}

// 修改 always
function transform3(fileInfo, api) {
  const j = api.jscodeshift

  return j(fileInfo.source)
    .find(j.MemberExpression, { property: { name: 'always' } })
    .replaceWith(p => {
      p.node.property.name = 'finally'
      return p.node
    })
    .toSource();
}

module.exports = adapt(transform);
// module.exports = adapt(transform1);
// module.exports = adapt(transform2);
// module.exports = adapt(transform3);

使い方


# 使用 bash 循环调用
jscodeshift -t src/myTransforms.js filepath

私のコードは、VUE単一ファイルモジュールなので、私は、サードパーティ製のプラグインVUE-jscodeshiftアダプタを使用しています。

概要

jscodeshiftは改造が大規模なプロジェクトのために非常に便利です。それはあなたがすぐに多くのコードを書き換えることができます、だけでなく、テストしやすいです。

参考リンク

  1. ビューjscodeshiftフィット
  2. 書き込みコード・ツー・リライトを-あなたのコード
  3. jscodeshift
  4. astexplorer

おすすめ

転載: www.cnblogs.com/htoooth/p/11370474.html