ทำไมสัญญาในที่สุดโครงการ Vue ของฉันไม่ทำงานใน Edge


15

ฉันมีปัญหาอย่างมากในการทำให้ polyfills ทำงานใน Edge ฉันพยายามติดตามเอกสารด้วยความพยายามต่าง ๆ ทั้งหมดไม่ทำงาน ดูเหมือนจะเป็นสัญญาในที่สุดโดยเฉพาะที่ไม่ทำงาน สิ่งนี้เกิดขึ้นในโมดูล vuexดังนั้นฉันจึงลองเพิ่ม vuex ลงใน transpileDependencies ใน vue.config แต่ไม่มีโชค

ป้อนคำอธิบายรูปภาพที่นี่

babel.config.js ของฉัน:

module.exports = {
  presets: [['@vue/cli-plugin-babel/preset', {
    useBuiltIns: 'entry',
  }]],
};

ใน main.js ของฉันฉันมีการนำเข้าสองรายการต่อไปนี้ในลำดับต้น ๆ :

import 'core-js/stable';
import 'regenerator-runtime/runtime';

vue.config.js ของฉัน

// eslint-disable-next-line import/no-extraneous-dependencies
const webpack = require('webpack');

const isProd = process.env.NODE_ENV === 'production';

module.exports = {
  configureWebpack: {
    // Set up all the aliases we use in our app.
    plugins: [
      new webpack.optimize.LimitChunkCountPlugin({
        maxChunks: 6,
      }),
    ],
  },
  css: {
    // Enable CSS source maps.
    sourceMap: !isProd,
  },
  transpileDependencies: ['vuex'],
};

หมายเหตุดังกล่าวข้างต้นฉันได้ลองทั้งที่มีและไม่มี transpileDepedencies มันบอกว่าที่นี่vue / babel-preset-appที่es7.promise.finallyรวมเป็น polyfill เริ่มต้น

รุ่น:

  • Microsoft Edge: 44.18
  • Microsoft EdgeHTML 18.18362
  • @ vue / cli-plugin-babel ":" ^ 4.1.2 "
  • "core-js": "^ 3.6.4"
  • "regenerator-runtime": "^ 0.13.3"

อัปเดต 13/02

ดังนั้นฉันจึงพยายามพิมพ์ Promise.prototype บนไซต์ของฉันที่ขอบและมันจะปรากฏว่าเป็น polyfilled: ที่นี่

ดังนั้นตอนนี้ฉันกำลังตรวจสอบว่าบางส่วนของโซ่ (axios / vue axios) ของฉันไม่คืนสัญญา เนื่องจากมันทำงานกับโครเมียมฉันสงสัยว่าส่วนหนึ่งของโซ่ไม่ได้รับการเติมโพลีอย่างถูกต้องหรือไม่?

นี่คือห่วงโซ่ทั้งหมดของฉัน:

/* VUEX MODULE ACTION */  
[a.ALL_CUSTOMERS](context) {
    context.commit(m.SET_CUSTOMER_LOADING, true);
    CustomerService.getAll()
      .then(({ data }) => {
        context.commit(m.SET_CUSTOMERS, data);
      })
      .finally(() => context.commit(m.SET_CUSTOMER_LOADING, false));
  },

/* CUSTOMER SERVICE */
import ApiService from '@/common/api.service';
const CustomerService = {
  getAll() {
    const resource = 'customers/';
    return ApiService.get(resource);
  },
...
}

/* API SERVICE */
import Vue from 'vue';
import axios from 'axios';
import VueAxios from 'vue-axios';

const ApiService = {
  init() {
    Vue.use(VueAxios, axios);
    let baseUrl = process.env.VUE_APP_APIURL;
    Vue.axios.defaults.baseURL = baseUrl;
  },

  setHeader() {
    Vue.axios.defaults.headers.common.Authorization = `Bearer ${getToken()}`;
  },

  get(resource) {
    this.setHeader();
    return Vue.axios.get(`${resource}`);
  },
  ...
}

3
น่าสนใจ Edge ไม่จำเป็นต้องมี polyfill เพราะรองรับfinally()สัญญาตั้งแต่ v18
Daniel

จากความอยากรู้รุ่น EdgeHTML คืออะไร คุณสามารถค้นหาได้ด้านล่างซึ่งคุณจะพบกับรุ่น Edge ฉันถามเพราะฐาน CanIUse สนับสนุนสิ่งนี้ จากเว็บไซต์ของพวกเขา:*Version number used for Edge is based on the number of EdgeHTML rather than Edge itself. This is because EdgeHTML is the engine for Edge that is related to feature support change.
แทนเนอร์

Microsoft EdgeHTML 18.18362
J.Kirk

2
Edge ควรบอกคุณว่ามันเป็นสัญญา มันค่อนข้างบอกว่ามันเป็นวัตถุ ดังนั้นวัตถุที่ส่งคืนไม่ใช่สัญญาที่คาดไว้
Mouser

2
คำถามนี้สามารถปรับปรุงได้โดยการจัดทำ repo ลงมาทำซ้ำปัญหาเพื่อให้คนอื่นสามารถช่วย ไซต์เช่นcodesandbox.ioสามารถใช้สำหรับสิ่งนี้ได้
Jair Reina

คำตอบ:


1

ฉันเคยประสบปัญหานี้มาก่อน ในที่สุดก็ใช้ไม่ได้กับ Edge ในที่สุดฉันก็อัพเดทเหมือน VVV ด้านล่างและใช้งานได้

สิ่งนี้ควรจัดการการขยายพันธุ์ของสิ่งมีชีวิตนั้นนอกเหนือไปจากพฤติกรรมที่มีรายละเอียดด้านล่าง:

Promise.prototype.finally = Promise.prototype.finally || {
  finally (fn) {
    const onFinally = value => Promise.resolve(fn()).then(() => value);
    return this.then(
      result => onFinally(result),
      reason => onFinally(Promise.reject(reason))
    );
  }
}.finally;

การใช้งานนี้ขึ้นอยู่กับพฤติกรรมของเอกสารในที่สุด ()และขึ้นอยู่กับนั้น ()เป็นไปตามข้อกำหนด:

การโทรกลับในที่สุดจะไม่ได้รับการโต้แย้งใด ๆ เนื่องจากไม่มีวิธีการที่เชื่อถือได้ในการพิจารณาว่าสัญญาได้รับการปฏิบัติตามหรือปฏิเสธ กรณีการใช้งานนี้มีไว้สำหรับเมื่อคุณไม่สนใจเกี่ยวกับเหตุผลการปฏิเสธหรือค่าการปฏิบัติตามดังนั้นจึงไม่จำเป็นต้องระบุ

ต่างจากPromise.resolve(2).then(() => {}, () => {})(ซึ่งจะแก้ไขด้วยไม่ได้กำหนด) Promise.resolve(2).finally(() => {})จะได้รับการแก้ไขด้วย 2

ในทำนองเดียวกันซึ่งแตกต่างจากPromise.reject(3).then(() => {}, () => {})(ซึ่งจะเติมเต็มด้วยไม่ได้กำหนด) Promise.reject(3).finally(() => {}) จะถูกปฏิเสธด้วย 3

หมายเหตุ : การโยน (หรือการส่งคืนสัญญาที่ถูกปฏิเสธ) ในการติดต่อกลับในที่สุดจะปฏิเสธสัญญาใหม่พร้อมเหตุผลการปฏิเสธที่ระบุเมื่อเรียกการโยน ()


0

นี่เป็นปัญหาที่เป็นที่รู้จักกันในแกน js

ในทางทฤษฎี Edge จะให้คำมั่นสัญญา polyfill ในที่สุด แต่อาจมีบางอย่างเกิดขึ้นกับการตรวจจับคุณสมบัติหรือรายการเบราว์เซอร์ของคุณและคุณต้องระบุ polyfill: ยัก:

ฉันจะลบทั้งปลั๊กอิน Vue babel และ core-js จากโครงการของคุณแล้ว npm ติดตั้งใหม่

  • npm install @vue/cli-plugin-babel --save-dev

  • npm install core-js --save

ตรวจสอบให้แน่ใจว่าคุณใช้ core-js @ 3 ผ่านทาง config (babel.config.js) ที่นี่

สุดท้ายมีปัญหา Github ไม่กี่พูดคุยเกี่ยวกับสัญญา + polyfills เกี่ยวกับห้องสมุดบุคคลที่สามอื่น ๆ ที่ดำเนินการในร้าน vuex ของคุณ เพิ่มทั้งสามของไลบรารีเหล่านั้น (axios, vue-axios, vuex) ในtranspileDependenciesส่วนของคุณ หากวิธีการนี้แก้ไขได้ให้เริ่มนำการอ้างอิงออกเพื่อดูว่าจำเป็นหรือไม่


ลองใช้คำแนะนำทั้งหมดของคุณน่าเสียดายที่ผลลัพธ์เดียวกัน :(
J.Kirk

แปลก. ปลั๊กอินของบุคคลที่สามลบ Promise.finally หรือไม่
เจส

ขอโทษที่ตอบช้า ฉันจะรู้ได้อย่างไรว่าปลั๊กอินของบุคคลที่สามลบหรือไม่
J.Kirk

0

ลองเพิ่ม.browserslistrcไฟล์ในรูทโปรเจ็กต์ของคุณด้วยเนื้อหาต่อไปนี้:

> 1%
last 2 versions

ดูhttps://github.com/browserslist/browserslist#best-practicesข้อมูลเกี่ยวกับlast versionsการกำหนดค่า


หากวิธีนี้ไม่สามารถแก้ไขการเติมโพลีที่ขาดหายไปให้ลองปิดการใช้งานปลั๊กอินที่คุณใช้ซึ่ง จำกัด จำนวนชิ้นเพื่อให้แน่ใจว่าสิ่งนี้จะไม่ทำให้เกิดการเติมโพลีใด ๆ

plugins: [
  new webpack.optimize.LimitChunkCountPlugin({
    maxChunks: 6,
  }),
],

ฉันมี browserlistrc กับรุ่นที่คุณระบุไว้แล้ว เพิ่งทดสอบโดยไม่มีปลั๊กอิน - ไม่มีผล :(
J.Kirk.

ไฟล์ปลั๊กอินของ Babel มี: module.exports = {presets: ['@ vue / cli-plugin-babel / preset']}
Marc

และคำสัญญาของคุณในที่สุดทำงานในขอบ? ความเป็นไปได้ใด ๆ ที่คุณสามารถแชร์รายการแพ็กเกจและการกำหนดค่าของคุณเพื่อให้ฉันสามารถลองหักแพ็กเกจที่ทำให้เกิดปัญหา
J.Kirk

ฉันมักจะสร้างโครงการของฉันโดยใช้cli.vuejs.org/guide/creating-a-project.html#vue-createแต่ Edge 18+ รองรับในที่สุด () ไม่จำเป็นต้องใช้โพลีเติมเฉพาะสำหรับ Internet Explorer หรือไม่
Marc

ปัญหาของคุณอาจแตกหน่อจาก ApiService ที่คุณใช้งานอยู่อาจไม่ได้ส่งคืนเนทีฟเนทีฟ แต่เป็นการจำลองที่สร้างขึ้นเอง ลองตั้งค่าการโทรเดียวกันโดยใช้ axios โดยตรงเป็นแบบทดสอบ
Marc
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.