Ngăn chặn RequireJS khỏi bộ đệm yêu cầu


302

RequireJS dường như làm một cái gì đó bên trong mà lưu trữ các tệp javascript cần thiết. Nếu tôi thực hiện thay đổi đối với một trong các tệp bắt buộc, tôi phải đổi tên tệp để thay đổi được áp dụng.

Thủ thuật phổ biến của việc nối thêm số phiên bản dưới dạng tham số chuỗi truy vấn vào cuối tên tệp không hoạt động với requestjs <script src="jsfile.js?v2"></script>

Những gì tôi đang tìm kiếm là một cách để ngăn chặn bộ đệm nội bộ này của các tập lệnh được yêu cầu RequireJS mà không phải đổi tên các tập tin tập lệnh của tôi mỗi khi chúng được cập nhật.

Giải pháp đa nền tảng:

Bây giờ tôi đang sử dụng urlArgs: "bust=" + (new Date()).getTime()để tự động lưu trữ bộ đệm trong quá trình phát triển và urlArgs: "bust=v2"để sản xuất khi tôi tăng số num phiên bản được mã hóa cứng sau khi đưa ra một tập lệnh được yêu cầu cập nhật.

Ghi chú:

@Dustin Getz đã đề cập trong một câu trả lời gần đây rằng Công cụ dành cho nhà phát triển Chrome sẽ bỏ các điểm dừng trong quá trình gỡ lỗi khi các tệp Javascript được làm mới liên tục như thế này. Một cách giải quyết khác là viết debugger;mã để kích hoạt điểm dừng trong hầu hết các trình gỡ lỗi Javascript.

Giải pháp dành riêng cho máy chủ:

Để biết các giải pháp cụ thể có thể hoạt động tốt hơn cho môi trường máy chủ của bạn như Node hoặc Apache, hãy xem một số câu trả lời dưới đây.


Bạn có chắc chắn đây không phải là máy chủ hoặc máy khách đang thực hiện bộ đệm không? (đã sử dụng js cần thiết trong một vài tháng nay và không nhận thấy bất cứ điều gì tương tự) IE đã bị bắt khi lưu kết quả hành động MVC, chrome đang lưu các mẫu html của chúng tôi nhưng tất cả các tệp js dường như được làm mới khi bộ đệm của trình duyệt đã được đặt lại. Tôi cho rằng nếu bạn đang tìm cách sử dụng bộ nhớ đệm nhưng bạn không thể làm như bình thường vì các yêu cầu từ js yêu cầu đã xóa chuỗi truy vấn có thể gây ra sự cố?
PJUK

Tôi không chắc nếu RequireJS xóa các số phiên bản được nối thêm như thế. Nó có thể là máy chủ của tôi. Thật thú vị khi RequireJS có cài đặt bộ đệm cache, vì vậy bạn có thể đúng về việc xóa số phiên bản được nối thêm của tôi trên các tệp được yêu cầu.
BumbleB2na

tôi đã cập nhật câu trả lời của mình bằng một giải pháp lưu trữ tiềm năng
Dustin Getz

Bây giờ tôi có thể thêm phần sau vào litany mà tôi đã đưa ra trong bài đăng trên blog của mình sáng nay: codrspace.com/dexygen/iêu Và đó là, tôi không chỉ phải thêm bộ đệm cache, mà còn yêu cầu bỏ qua việc làm mới khó khăn.
Dexygen

Tôi bối rối về trường hợp sử dụng cho việc này .... Đây có phải là cho các mô-đun AMD tải lại nóng vào mặt trước hay không?
Alexander Mills

Câu trả lời:


457

RequireJS có thể được cấu hình để nối thêm một giá trị cho mỗi url của tập lệnh để xóa bộ đệm.

Từ tài liệu RequireJS ( http://requirejs.org/docs/api.html#config ):

urlArss : Đối số chuỗi truy vấn bổ sung được thêm vào các URL mà RequireJS sử dụng để tìm nạp tài nguyên. Hữu ích nhất để lưu trữ bộ đệm khi trình duyệt hoặc máy chủ không được cấu hình đúng.

Ví dụ, nối thêm "v2" cho tất cả các tập lệnh:

require.config({
    urlArgs: "bust=v2"
});

Đối với mục đích phát triển, bạn có thể buộc RequireJS bỏ qua bộ đệm bằng cách nối thêm dấu thời gian:

require.config({
    urlArgs: "bust=" + (new Date()).getTime()
});

46
Rất hữu ích, cảm ơn bạn. Tôi đang sử dụng urlArgs: "bust=" + (new Date()).getTime()để tự động xóa bộ nhớ cache trong quá trình phát triển và urlArgs: "bust=v2"để sản xuất khi tôi tăng số num phiên bản được mã hóa cứng sau khi đưa ra một tập lệnh được yêu cầu cập nhật.
BumbleB2na

9
... cũng là trình tối ưu hóa hiệu suất, bạn có thể sử dụng Math.random () thay vì (Ngày mới ()). getTime (). Nó đẹp hơn, không tạo đối tượng và jsperf.com/speedcomparison nhanh hơn một chút .
Vlad Tsepelev

2
Bạn có thể lấy nó chỉ nhỏ hơn một chút:urlArgs: "bust=" + (+new Date)
mrzmyr

11
Tôi nghĩ rằng việc phá bộ nhớ cache mỗi lần là một ý tưởng tồi tệ. Thật không may RequireJS không cung cấp một sự thay thế khác. Chúng tôi sử dụng urlArss nhưng không sử dụng dấu thời gian ngẫu nhiên hoặc dấu thời gian cho việc này. Thay vào đó, chúng tôi sử dụng Git SHA hiện tại của mình, cách đó chỉ thay đổi khi chúng tôi triển khai mã mới.
Ivan Torres

5
Làm thế nào biến thể "v2" này có thể hoạt động trong sản xuất, nếu tệp cung cấp chính chuỗi "v2" được lưu trữ? Nếu tôi phát hành một ứng dụng mới vào sản xuất, việc thêm "v3" sẽ không làm được gì, vì ứng dụng sẽ vui vẻ tiếp tục làm việc với các tệp v2 được lưu trong bộ nhớ cache, bao gồm cả cấu hình cũ với v2 urlArgs.
Benny Bottema 27/2/2015

54

Không sử dụng urlArss cho việc này!

Yêu cầu tải tập lệnh tôn trọng tiêu đề bộ đệm http. (Tập lệnh được tải tự động chèn <script>, có nghĩa là yêu cầu trông giống như bất kỳ tài sản cũ nào được tải.)

Phục vụ tài sản javascript của bạn với các tiêu đề HTTP thích hợp để vô hiệu hóa bộ đệm trong quá trình phát triển.

Sử dụng urlArss của request có nghĩa là bất kỳ điểm dừng nào bạn đặt sẽ không được bảo toàn trong các lần làm mới; cuối cùng bạn cần đặt các debuggercâu lệnh ở mọi nơi trong mã của bạn. Xấu. Tôi sử dụng urlArgscho các tài sản phá bộ nhớ cache trong quá trình nâng cấp sản xuất với git sha; sau đó tôi có thể đặt tài sản của mình được lưu trữ vĩnh viễn và được đảm bảo không bao giờ có tài sản cũ.

Trong quá trình phát triển, tôi giả định tất cả các yêu cầu ajax với cấu hình mockjax phức tạp , sau đó tôi có thể phục vụ ứng dụng của mình ở chế độ chỉ javascript với máy chủ http python 10 dòng với tất cả bộ nhớ đệm đã tắt . Điều này đã mở rộng cho tôi một ứng dụng "enterprisey" khá lớn với hàng trăm điểm cuối dịch vụ web yên tĩnh. Chúng tôi thậm chí có một nhà thiết kế hợp đồng có thể làm việc với cơ sở sản xuất thực tế của chúng tôi mà không cho anh ta truy cập vào mã phụ trợ của chúng tôi.


8
@ JamesP.Wright, bởi vì (ít nhất là trong Chrome) khi bạn đặt điểm dừng cho một điều gì đó xảy ra khi tải trang, sau đó nhấp vào làm mới, điểm dừng không bị tấn công vì URL đã thay đổi và Chrome đã bỏ điểm dừng. Tôi muốn biết một cách giải quyết chỉ dành cho khách hàng về vấn đề này.
Drew Noakes

1
Cảm ơn, Dustin. Nếu bạn tìm thấy một cách xung quanh này xin vui lòng gửi. Trong khi đó, bạn có thể sử dụng debugger;mã của mình bất cứ nơi nào bạn muốn điểm dừng tồn tại.
BumbleB2na

2
Đối với bất kỳ ai sử dụng máy chủ http trên nút (npm cài đặt máy chủ http). Bạn cũng có thể tắt bộ đệm ẩn với -c-1 (tức là http-server -c-1).
Yourpalal

5
Bạn có thể tắt bộ nhớ đệm trong Chrome để khắc phục sự cố gỡ lỗi trong quá trình phát triển: stackoverflow.com/questions/5690269/
Kẻ

5
+1 đến !!! KHÔNG SỬ DỤNG urlArss TRONG SẢN XUẤT !!! . Hãy tưởng tượng trường hợp trang web của bạn có 1000 tệp JS (có, có thể!) Và tải của chúng được kiểm soát bởi requiredJS. Bây giờ bạn phát hành v2 hoặc trang web của bạn, nơi chỉ có một vài tệp JS được thay đổi! nhưng bằng cách thêm urlArss = v2, bạn buộc phải tải lại tất cả 1000 tệp JS! bạn sẽ trả rất nhiều lưu lượng chỉ các tệp đã sửa đổi mới được tải lại, tất cả các tệp khác sẽ được phản hồi với trạng thái 304 (Không được sửa đổi).
walv

24

Giải pháp urlArss có vấn đề. Thật không may, bạn không thể kiểm soát tất cả các máy chủ proxy có thể nằm giữa bạn và trình duyệt web của người dùng. Một số máy chủ proxy có thể không may được cấu hình để bỏ qua các tham số URL khi lưu trữ tệp. Nếu điều này xảy ra, phiên bản sai của tệp JS của bạn sẽ được gửi đến người dùng của bạn.

Cuối cùng tôi đã từ bỏ và thực hiện sửa lỗi của riêng tôi trực tiếp vào allow.js. Nếu bạn sẵn sàng sửa đổi phiên bản thư viện của bạn, giải pháp này có thể phù hợp với bạn.

Bạn có thể xem bản vá ở đây:

https://github.com/jbcpollak/requirejs/commit/589ee0cdfe6f719cd761eee631ce68eee09a5a67

Sau khi thêm, bạn có thể làm một cái gì đó như thế này trong cấu hình yêu cầu của bạn:

var require = {
    baseUrl: "/scripts/",
    cacheSuffix: ".buildNumber"
}

Sử dụng hệ thống xây dựng hoặc môi trường máy chủ của bạn để thay thế buildNumberbằng id sửa đổi / phiên bản phần mềm / màu yêu thích.

Sử dụng yêu cầu như thế này:

require(["myModule"], function() {
    // no-op;
});

Sẽ gây ra yêu cầu yêu cầu tập tin này:

http://yourserver.com/scripts/myModule.buildNumber.js

Trên môi trường máy chủ của chúng tôi, chúng tôi sử dụng các quy tắc viết lại url để loại bỏ buildNumber và cung cấp tệp JS chính xác. Bằng cách này, chúng tôi thực sự không phải lo lắng về việc đổi tên tất cả các tệp JS của mình.

Bản vá sẽ bỏ qua bất kỳ tập lệnh nào chỉ định một giao thức và nó sẽ không ảnh hưởng đến bất kỳ tệp không phải là JS.

Điều này hoạt động tốt cho môi trường của tôi, nhưng tôi nhận ra một số người dùng sẽ thích tiền tố hơn là hậu tố, nên dễ dàng sửa đổi cam kết của tôi cho phù hợp với nhu cầu của bạn.

Cập nhật:

Trong cuộc thảo luận về yêu cầu kéo, tác giả requestjs cho rằng điều này có thể hoạt động như một giải pháp để thêm tiền tố vào số sửa đổi:

var require = {
    baseUrl: "/scripts/buildNumber."
};

Tôi chưa thử điều này, nhưng hàm ý là điều này sẽ yêu cầu URL sau:

http://yourserver.com/scripts/buildNumber.myModule.js

Điều này có thể hoạt động rất tốt cho nhiều người có thể sử dụng tiền tố.

Dưới đây là một số câu hỏi trùng lặp có thể có:

RequireJS và bộ nhớ cache proxy

Yêu cầu - Làm cách nào tôi có thể đặt phiên bản trên các mô-đun được yêu cầu làm một phần của URL?


1
Tôi thực sự muốn thấy bản cập nhật của bạn đi vào bản dựng yêu cầu chính thức. Tác giả chính của các yêu cầu cũng có thể quan tâm (xem câu trả lời của @ Louis ở trên).
BumbleB2na

@ BumbleB2na - hãy bình luận về PullRequest ( github.com/jrburke/requirejs/pull/1017 ), jrburke dường như không quan tâm. Anh ta đề xuất một giải pháp sử dụng tiền tố tên tệp, tôi sẽ cập nhật câu trả lời của mình để đưa vào đó.
JBCP

1
Cập nhật tốt đẹp. Tôi nghĩ rằng tôi thích đề xuất này của tác giả, nhưng đó chỉ là vì tôi đã sử dụng quy ước đặt tên này gần đây : /scripts/myLib/v1.1/. Tôi đã thử thêm tiền tố (hoặc tiền tố) vào tên tệp của mình, có lẽ vì đó là những gì jquery làm, nhưng sau một thời gian, tôi [lười biếng và] bắt đầu tăng số phiên bản trên thư mục mẹ. Tôi nghĩ rằng nó giúp việc bảo trì dễ dàng hơn đối với tôi trên một trang web lớn, nhưng bây giờ bạn thấy tôi lo lắng về những cơn ác mộng viết lại URL.
BumbleB2na

1
Các hệ thống giao diện người dùng hiện đại chỉ cần viết lại các tệp JS và với tổng MD5 trong tên tệp và sau đó viết lại các tệp HTML để sử dụng tên tệp mới khi xây dựng, nhưng điều đó trở nên khó khăn với các hệ thống cũ mà mã phía trước được phục vụ bởi phía máy chủ.
JBCP

cái này có hoạt động không khi tôi yêu cầu một số js trong tệp <script data-main="${pageContext.request.contextPath}/resources/scripts/main" src="${pageContext.request.contextPath}/resources/scripts/require.js"> <jsp:text/> </script> <script> require([ 'dev/module' ]); </script>
jspx

19

Lấy cảm hứng từ bộ nhớ cache hết hạn trên data.js chính, chúng tôi đã cập nhật tập lệnh triển khai của chúng tôi với tác vụ ant sau:

<target name="deployWebsite">
    <untar src="${temp.dir}/website.tar.gz" dest="${website.dir}" compression="gzip" />       
    <!-- fetch latest buildNumber from build agent -->
    <replace file="${website.dir}/js/main.js" token="@Revision@" value="${buildNumber}" />
</target>

Nơi bắt đầu của main.js trông như sau:

require.config({
    baseUrl: '/js',
    urlArgs: 'bust=@Revision@',
    ...
});

11

Trong sản xuất

urlArgs có thể gây ra vấn đề!

Tác giả chính của allowjs không thích sử dụngurlArgs :

Đối với các tài sản được triển khai, tôi thích đặt phiên bản hoặc hàm băm cho toàn bộ bản dựng dưới dạng thư mục bản dựng, sau đó chỉ cần sửa đổi baseUrlcấu hình được sử dụng cho dự án để sử dụng thư mục được phiên bản đó làm baseUrl. Sau đó, không có tệp nào khác thay đổi và nó giúp tránh một số vấn đề về proxy khi chúng không thể lưu trữ URL với chuỗi truy vấn trên đó.

[Tạo kiểu của tôi.]

Tôi làm theo lời khuyên này.

Trong giai đoạn phát triển

Tôi thích sử dụng một máy chủ lưu trữ thông minh các tệp có thể thay đổi thường xuyên: một máy chủ phát ra Last-Modifiedvà phản hồi If-Modified-Sincevới 304 khi thích hợp. Ngay cả một máy chủ dựa trên bộ chuyển phát nhanh của Node để phục vụ các tệp tĩnh cũng thực hiện ngay việc này. Nó không yêu cầu làm bất cứ điều gì với trình duyệt của tôi và không làm rối các điểm dừng.


Điểm tốt, nhưng câu trả lời của bạn là cụ thể cho môi trường máy chủ của bạn. Có lẽ một sự thay thế tốt cho bất kỳ ai khác vấp phải điều này là đề xuất gần đây để thêm số phiên bản vào tên tệp thay vì tham số chuỗi truy vấn. Dưới đây là thông tin thêm về chủ đề đó: stevesouders.com/blog/2008/08/23/ từ
BumbleB2na

Chúng tôi đang chạy đến vấn đề cụ thể này trong một hệ thống sản xuất. Tôi khuyên bạn nên điều chỉnh tên tệp của mình thay vì sử dụng tham số.
JBCP

7

Tôi đã lấy đoạn mã này từ AskApache và đặt nó vào một tệp .conf riêng biệt của máy chủ web Apache cục bộ của tôi (trong trường hợp của tôi /etc/apache2/others/preventcaching.conf):

<FilesMatch "\.(html|htm|js|css)$">
FileETag None
<ifModule mod_headers.c>
Header unset ETag
Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
Header set Pragma "no-cache"
Header set Expires "Wed, 11 Jan 1984 05:00:00 GMT"
</ifModule>
</FilesMatch>

Để phát triển, nó hoạt động tốt mà không cần thay đổi mã. Đối với sản xuất, tôi có thể sử dụng phương pháp của @ dvtoever.


6

Sửa chữa nhanh để phát triển

Để phát triển, bạn chỉ có thể tắt bộ đệm trong Công cụ phát triển Chrome ( Tắt bộ đệm Chrome để phát triển trang web ). Việc vô hiệu hóa bộ đệm chỉ xảy ra nếu hộp thoại dev tools mở, vì vậy bạn không cần phải lo lắng về việc bật tùy chọn này mỗi khi bạn duyệt web thông thường.

Lưu ý: Sử dụng ' urlArss ' là giải pháp phù hợp trong sản xuất để người dùng có được mã mới nhất. Nhưng nó làm cho việc gỡ lỗi trở nên khó khăn vì chrome vô hiệu hóa các điểm dừng với mỗi lần làm mới (vì tệp 'mới' của nó được phục vụ mỗi lần).


3

Tôi không khuyên bạn nên sử dụng ' urlArss ' cho bộ đệm cache với RequireJS. Vì điều này không giải quyết vấn đề đầy đủ. Cập nhật một phiên bản sẽ không dẫn đến việc tải xuống tất cả các tài nguyên, mặc dù bạn chỉ thay đổi một tài nguyên.

Để xử lý vấn đề này, tôi khuyên bạn nên sử dụng các mô-đun Grunt như 'filerev' để tạo bản sửa đổi số. Trên hết, tôi đã viết một tác vụ tùy chỉnh trong Gruntfile để cập nhật bản sửa đổi bất cứ nơi nào cần thiết.

Nếu cần tôi có thể chia sẻ đoạn mã cho nhiệm vụ này.


Tôi sử dụng kết hợp grunt-filerev và grunt-cache-buster để viết lại các tệp Javascript.
Ian Jamieson

2

Đây là cách tôi thực hiện trong Django / Flask (có thể dễ dàng thích nghi với các ngôn ngữ / hệ thống VCS khác):

Trong của bạn config.py(tôi sử dụng điều này trong python3, vì vậy bạn có thể cần phải điều chỉnh mã hóa trong python2)

import subprocess
GIT_HASH = subprocess.check_output(['git', 'rev-parse', 'HEAD']).strip().decode('utf-8')

Sau đó, trong mẫu của bạn:

{% if config.DEBUG %}
     require.config({urlArgs: "bust=" + (new Date().getTime())});
{% else %}
    require.config({urlArgs: "bust=" + {{ config.GIT_HASH|tojson }}});
{% endif %}
  • Không yêu cầu quá trình xây dựng thủ công
  • Chỉ chạy git rev-parse HEADmột lần khi ứng dụng khởi động và lưu trữ nó trong configđối tượng

0

Giải pháp động (không có urlArss)

Có một giải pháp đơn giản cho vấn đề này, để bạn có thể tải một số sửa đổi duy nhất cho mỗi mô-đun.

Bạn có thể lưu chức năng requestjs.load ban đầu, ghi đè lên chức năng của chính bạn và phân tích url đã sửa đổi của bạn thành yêu cầu ban đầu.

var load = requirejs.load;
requirejs.load = function (context, moduleId, url) {
    url += "?v=" + oRevision[moduleId];
    load(context, moduleId, url);
};

Trong quá trình xây dựng của chúng tôi, tôi đã sử dụng "gulp-rev" để xây dựng một tệp kê khai với tất cả các sửa đổi của tất cả các mô-đun đang sử dụng. Phiên bản đơn giản hóa của nhiệm vụ gulp của tôi:

gulp.task('gulp-revision', function() {
    var sManifestFileName = 'revision.js';

    return gulp.src(aGulpPaths)
        .pipe(rev())
        .pipe(rev.manifest(sManifestFileName, {
        transformer: {
            stringify: function(a) {
                var oAssetHashes = {};

                for(var k in a) {
                    var key = (k.substr(0, k.length - 3));

                    var sHash = a[k].substr(a[k].indexOf(".") - 10, 10);
                    oAssetHashes[key] = sHash;
                }

                return "define([], function() { return " + JSON.stringify(oAssetHashes) + "; });"
            }
        }
    }))
    .pipe(gulp.dest('./'));
});

điều này sẽ tạo ra một mô-đun AMD với các số sửa đổi thành moduleNames, được bao gồm dưới dạng 'oRevision' trong tệp main.js, nơi bạn ghi đè lên hàm requestjs.load như được hiển thị trước đó.


-1

Đây là câu trả lời được chấp nhận của @phil mccull.

Tôi sử dụng phương pháp của anh ấy nhưng tôi cũng tự động hóa quy trình bằng cách tạo mẫu T4 để chạy trước khi xây dựng.

Các lệnh trước khi xây dựng:

set textTemplatingPath="%CommonProgramFiles(x86)%\Microsoft Shared\TextTemplating\$(VisualStudioVersion)\texttransform.exe"
if %textTemplatingPath%=="\Microsoft Shared\TextTemplating\$(VisualStudioVersion)\texttransform.exe" set textTemplatingPath="%CommonProgramFiles%\Microsoft Shared\TextTemplating\$(VisualStudioVersion)\texttransform.exe"
%textTemplatingPath% "$(ProjectDir)CacheBuster.tt"

nhập mô tả hình ảnh ở đây

Mẫu T4:

nhập mô tả hình ảnh ở đây

Tạo tệp: nhập mô tả hình ảnh ở đây

Lưu trữ trong biến trước khi request.config.js được tải: nhập mô tả hình ảnh ở đây

Tham chiếu trong allow.config.js:

nhập mô tả hình ảnh ở đây


2
Có thể vì giải pháp của bạn cho vấn đề JavaScript là một loạt mã C #. Đây cũng là một loạt các công việc và mã bổ sung để làm một cái gì đó cuối cùng được thực hiện theo cách chính xác như câu trả lời được chấp nhận.
mAAdhaTTah

@mAAdhaTTah Bạn có thể làm điều này với bất kỳ ngôn ngữ phía máy chủ nào ... không phải là c #. Ngoài ra, điều này sẽ tự động hóa quá trình, cập nhật bộ đệm cache khi bạn xây dựng một phiên bản mới của dự án để đảm bảo rằng khách hàng luôn lưu trữ phiên bản mới nhất của các tập lệnh. Tôi không nghĩ rằng nó xứng đáng được đánh dấu tiêu cực. Nó chỉ là mở rộng câu trả lời bằng cách đưa ra một cách tiếp cận tự động cho giải pháp.
Họa sĩ Zach

Về cơ bản tôi đã tạo ra điều này bởi vì khi duy trì một ứng dụng đã sử dụng allow.js, tôi thấy khá khó chịu khi phải tự nhận xét "(ngày mới ()). GetTime ()) và bỏ ghi chú bộ đệm ẩn tĩnh mỗi khi tôi cập nhật ứng dụng Thật dễ dàng để quên. Thật bất ngờ, khách hàng đang xác minh các thay đổi và thấy tập lệnh được lưu trong bộ nhớ cache để họ nghĩ rằng không có gì thay đổi .. Tất cả chỉ vì bạn quên thay đổi bộ đệm. Một chút mã bổ sung này sẽ xóa đi cơ hội xảy ra.
Họa sĩ Zach

2
Tôi đã không đánh dấu nó xuống, tôi không biết những gì thực sự đã xảy ra. Tôi chỉ đề xuất mã không chỉ không phải js, mà là ngôn ngữ tạo khuôn mẫu C #, sẽ không hữu ích cho các nhà phát triển JS đang cố gắng có câu trả lời cho vấn đề của họ.
mAAdhaTTah

-2

Trong trường hợp của tôi, tôi muốn tải cùng một hình thức mỗi lần tôi nhấp, tôi không muốn những thay đổi tôi đã thực hiện trên tệp. Nó có thể không liên quan đến bài đăng này một cách chính xác, nhưng đây có thể là một giải pháp tiềm năng ở phía máy khách mà không cần thiết lập cấu hình cho yêu cầu. Thay vì gửi nội dung trực tiếp, bạn có thể tạo một bản sao của tệp yêu cầu và giữ nguyên tệp thực tế.

LoadFile(filePath){
    const file = require(filePath);
    const result = angular.copy(file);
    return result;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.