1659016800
Gần đây tôi đã phải cung cấp một chức năng mới cho dự án của mình: chức năng "tải xuống dưới dạng PDF". Điều đầu tiên tôi tự hỏi là tại sao chúng tôi nên cung cấp chức năng này? Không phải nó đã tồn tại nguyên bản với hầu hết các trình duyệt web với tùy chọn nhấp chuột phải / print / "save as pdf"? Tôi đã thử trên trang web của mình và kết quả thực sự đáng thất vọng:
Ví dụ trên trang ngẫu nhiên Boursorama , giống như sau:
kết xuất:
Đó là khi tôi nói "ok, tính năng này có thể đáng giá", nhưng tôi nên làm như thế nào? Có nhiều thư viện mã nguồn mở có thể tạo PDF. Nhưng sự lựa chọn của tôi tự nhiên đến với thư viện nổi tiếng do google phát triển: Puppeteer. Theo tôi, đó là cách dễ nhất để giải quyết việc tạo ra các Ứng dụng Trang đơn PDF. Có thể không phải như vậy nếu bạn không xử lý các gói javascript nhưng với HTML / CSS thuần túy. Thật vậy, có những giải pháp dễ dàng hơn cho trường hợp sử dụng này như wkhtmltopdf, html-pdf-node hoặc jspdf chẳng hạn.
Trong bài viết này, tôi muốn cung cấp cho bạn một số mẹo để tạo các tệp PDF đẹp của các SPA với Puppeteer. Đầu tiên, tôi sẽ giải thích cho bạn cách bạn có thể tạo phiên bản có thể in được trên trang của mình bằng React và Puppeteer. Sau đó, tôi sẽ chỉ cho bạn cách sử dụng Puppeteer để tạo trang có thể in mới của bạn.
Đối với phần này, bạn thực sự không cần phải thiết lập Puppeteer hoặc bất kỳ dịch vụ máy in nào khác. Bạn có thể thực hiện các thay đổi đối với mã của mình như bình thường, sau đó nhấn ctrl + P trên trang của bạn để xem nó trông như thế nào:
Tuy nhiên, vòng lặp phản hồi không nhanh như bình thường.
Để điều chỉnh mã của bạn để in, bạn phải bỏ qua 2 điểm khác biệt chính giữa trang web và PDF:
Tạo "phiên bản có thể in" của SPA của bạn bằng React. Để tạo phiên bản có thể in của trang của chúng tôi, bạn sẽ phải thêm / xóa / sửa đổi các thành phần khác nhau tạo nên trang.
Về cơ bản, bạn có 2 giải pháp cho phần này:
Nếu bạn chọn giải pháp thứ hai (ít tốn kém hơn), bạn sẽ phải điều chỉnh các thành phần hiện có của mình. Ví dụ: nếu bạn có một bảng với 3 tab, có thể bạn sẽ muốn hiển thị nội dung của tất cả các tab. Một cái gì đó như hiển thị các tab lần lượt có thể thực hiện thủ thuật:
Chỉ động:
<Table selectedTabIndex="tab1" />
Động và Tĩnh:
const tabNames = ['tab1', 'tab2', 'tab3']
(isPrintable ?
tabNames.map(tabName => <Table key={tabName} selectedTab={tabName} /> :
<Table selectedTabIndex='tab1' />
);
Trong trường hợp này, các isPrintable
đạo cụ sẽ quyết định hiển thị 3 tab hay chỉ hiển thị tab đầu tiên. Bạn có thể chuyển đạo cụ này cho mọi thành phần động trên trang của mình, cần được điều chỉnh để in.
Như bạn có thể thấy với ví dụ Boursorama, các thành phần của bạn có thể bị cắt giữa 2 trang khi cố gắng in trang của bạn. Nó xảy ra vì trình duyệt web của bạn không biết phải ngắt trang ở đâu nếu bạn không nói cho anh ta biết. Đây là nơi thuộc tính break-inside
CSS bước vào. Rõ ràng là bạn không muốn tập hợp các tab trước đó của mình bị cắt ở giữa. Không có đồ thị của bạn hoặc hầu như bất kỳ thành phần nào trên trang của bạn. Sau đó, bạn sẽ phải điều chỉnh mã trước đó để thêm thuộc tính CSS này. Nó sẽ hoạt động với inline-css nhưng bạn có thể không muốn thêm mọi thứ style={{ breakInside: 'avoid' }}
vào mọi nơi trong tệp jsx / tsx của mình.
Bạn muốn sử dụng bảng định kiểu. Và thay vì thêm thuộc tính này trên mọi lớp CSS đã tồn tại, bạn sẽ muốn sử dụng media @print
tùy chọn. Điều này sẽ cho phép bạn tùy chỉnh trang web của mình để chỉ in! Ví dụ: bạn có thể muốn văn bản của mình lớn hơn một chút hoặc có màu xám mịn trên phiên bản có thể in được, vì bất kỳ lý do thẩm mỹ hoặc tiện lợi nào.
Chúng tôi sẽ chỉ thêm cái này vào @media object
tệp css của bạn:
media @print {
body: {
font-size: "16px";
color: "lightgrey";
}
.no-break-inside {
// apply this class to every component that shouldn't be cut off between to pages of your PDF
break-inside: "avoid";
}
.break-before {
// apply this class to every component that should always display on next page
break-before: "always";
}
}
<MyComponent isPrintable=true className="no-break-inside" />
Một vài mẹo CSS này sẽ giúp bạn cải thiện rất nhiều việc hiển thị trang web của mình.
Bây giờ, trang của bạn đã sẵn sàng để in. Bạn biết điều đó khi chuyển các isPrintable
đạo cụ đến trang của mình, nhấp chuột phải + in trên trình duyệt của mình và bạn khá thoải mái với những gì mình nhìn thấy. Đây là phần in ấn. Bây giờ bạn có phiên bản có thể in của trang web của mình, nhưng người dùng không biết về nó và ngay cả khi nhấn ctrl + P trên trang web, họ sẽ thấy phiên bản "động" của trang web. Để cho phép họ tạo phiên bản PDF và tự động tạo phiên bản mới nhất, bạn có thể muốn thêm một nút sẽ tạo trực tiếp phía máy chủ PDF và thậm chí thêm một số tùy chỉnh. Đây là thứ, trong số những thứ khác, Puppeteer được sử dụng để làm.
Puppeteer là một cách phổ biến và tự nhiên để điều khiển Chrome. Nó cung cấp quyền truy cập đầy đủ vào các tính năng của trình duyệt và quan trọng nhất là có thể chạy Chrome ở chế độ hoàn toàn không sử dụng đầu trên máy chủ từ xa […]
—Dima Bekerman, https://www.imperva.com/blog/headless-chrome-devops-love-it-so-do-hackers-heres-why/
![]() |
---|
Lược đồ về cách Puppeteer hoạt động phía máy chủ |
Việc tạo ra ứng dụng React được thực hiện bởi trình duyệt web. Chúng tôi cần môi trường tối thiểu có thể thực thi javascript để hiển thị DOM. Puppeteer sẽ làm điều đó bằng cách phóng một crôm không đầu. Kể từ bây giờ, và vì quá trình tạo được thực hiện trên máy chủ, nên trình duyệt web không cần phải có giao diện người dùng đồ họa (GUI). Chromium với tạo phiên bản có thể in: cùng một trang mà người dùng nhìn thấy trên trình duyệt web của mình nhưng đã isPrintable
kích hoạt đạo cụ. Sau đó Puppeteer sẽ thực thi pdf
chức năng trên trang với một số tùy chọn tùy chỉnh sẽ kích hoạt việc in trang.
Chỉ cần thêm nút có URL gọi dịch vụ máy in:
<Button onClick={window.open(downloadUrl, "_blank")}>Download as PDF</Button>
Đây downloadUrl
thực sự là một yêu cầu GET trên máy chủ của bạn sẽ thực thi Puppeteer trên máy chủ và trả về nội dung có kiểu nội dungapplication/pdf
Vậy mã Puppeteer này trông như thế nào?
Để có thể thực sự tải xuống PDF, bạn chỉ cần một vài dòng mã.
Sau đó, mã tối thiểu sẽ trông giống như sau:
const puppeteer = require("puppeteer");
(async () => {
const browser = await puppeteer.launch(); // launch a browser (chromium by default but you can chose another one)
const page = await browser.newPage(); // open a page in the browser
await page.goto("https://printable-version-of-my-wbe-page.com", {
waitUntil: "networkidle2",
}); // visit the printable version of your page
await page.pdf({ format: "a4", path: "./my_file.pdf" }); // generate the PDF 🎉
await browser.close(); // don't forget to close the browser. Otherwise, it may cause performances issues or the server may even crash..
})();
Đây là các bước phổ biến bạn sẽ cần để tạo tệp PDF. Tùy thuộc vào chương trình phụ trợ của bạn, có thể bạn không muốn tải xuống tệp PDF trên máy chủ mà hiển thị nó trên một đối tượng phản hồi, để gửi nó trở lại máy khách (trình duyệt web của người dùng). Sau đó, bạn nên điều chỉnh page.pdf()
phương pháp const buffer = await page.pdf({ format: 'a4'});
và trả lại vùng đệm này trên _blank
trang mà người dùng đã mở trên trình duyệt của mình, chờ phản hồi.
Tất nhiên, bạn có thể điều chỉnh các tùy chọn tự nhiên có trên trình duyệt của mình, như khổ giấy, tỷ lệ, lề, v.v. với sự trợ giúp của tài liệu chính thức: https://github.com/puppeteer/puppeteer/blob/v10 .4.0 / docs / api.md # pagepdfoptions .
Một tùy chọn thú vị mà tôi đề xuất, chủ yếu là vì tùy chọn mặc định do Google Chrome cung cấp thực sự xấu, là mẫu đầu trang hoặc chân trang. Chỉ cần đọc mẫu tệp HTML và chuyển nó qua dữ liệu bạn muốn hiển thị, chẳng hạn như ngày hiện tại, số trang cho mỗi trang hoặc thậm chí là hình ảnh / biểu trưng:
const footerBase = fs.readFileSync("./footer.html", "utf8");
customFooter = footerBase
.replace("{{date}}", new Date())
.replace("{{image_data}}", imageData);
await page.pdf({ format: "a4", footerTemplate: customFooter });
sử dụng mẫu html
<style>
#logo {
height: 40px;
content: url("data:image/png;base64,{{image_data}}");
}
</style>
<div id="body">
<div id="page-number-paragraph">
<span id="date">{{date}}</span>
<span>Page</span>
<span class="pageNumber"/></span>
<span>/</span>
<span class="totalPages"></span>
</div>
<div id="brand-container">
<span id="logo"></span>
</div>
</div>
Bây giờ bạn đã cung cấp cho tệp PDF của mình một chân trang được tùy chỉnh hoàn toàn.
Có rất nhiều tùy chọn khác liên quan đến việc tạo PDF, mà còn đối với các bước khởi chạy trình duyệt trước đó, mở trang mới, truy cập URL, điều này sẽ cho phép bạn tùy chỉnh hoàn toàn việc tạo PDF của mình trên máy chủ.
Cuối cùng, bằng cách điều chỉnh mã React / CSS của bạn và sử dụng Puppeteer, bạn có thể dễ dàng cung cấp một tệp PDF hoàn toàn tùy chỉnh cho trang của mình. Hơn nữa, Puppeteer đang làm tất cả những thứ ở phía máy chủ. Điều này làm cho tính năng này hoàn toàn minh bạch, khá nhanh cho người dùng cuối và mang lại kết quả tương tự cho mọi người dùng trên bất kỳ trình duyệt nào! Puppeteer thực sự mạnh mẽ và có nhiều tùy chọn giúp tạo PDF khá dễ dàng cho các nhà phát triển, đồng thời kết xuất tùy chỉnh và đẹp hơn nhiều so với mặc định trên trình duyệt của người dùng.
Nguồn: https://blog.theodo.com/2021/10/pdf-generation-react-puppeteer/
1598839687
If you are undertaking a mobile app development for your start-up or enterprise, you are likely wondering whether to use React Native. As a popular development framework, React Native helps you to develop near-native mobile apps. However, you are probably also wondering how close you can get to a native app by using React Native. How native is React Native?
In the article, we discuss the similarities between native mobile development and development using React Native. We also touch upon where they differ and how to bridge the gaps. Read on.
Let’s briefly set the context first. We will briefly touch upon what React Native is and how it differs from earlier hybrid frameworks.
React Native is a popular JavaScript framework that Facebook has created. You can use this open-source framework to code natively rendering Android and iOS mobile apps. You can use it to develop web apps too.
Facebook has developed React Native based on React, its JavaScript library. The first release of React Native came in March 2015. At the time of writing this article, the latest stable release of React Native is 0.62.0, and it was released in March 2020.
Although relatively new, React Native has acquired a high degree of popularity. The “Stack Overflow Developer Survey 2019” report identifies it as the 8th most loved framework. Facebook, Walmart, and Bloomberg are some of the top companies that use React Native.
The popularity of React Native comes from its advantages. Some of its advantages are as follows:
Are you wondering whether React Native is just another of those hybrid frameworks like Ionic or Cordova? It’s not! React Native is fundamentally different from these earlier hybrid frameworks.
React Native is very close to native. Consider the following aspects as described on the React Native website:
Due to these factors, React Native offers many more advantages compared to those earlier hybrid frameworks. We now review them.
#android app #frontend #ios app #mobile app development #benefits of react native #is react native good for mobile app development #native vs #pros and cons of react native #react mobile development #react native development #react native experience #react native framework #react native ios vs android #react native pros and cons #react native vs android #react native vs native #react native vs native performance #react vs native #why react native #why use react native
1659016800
Gần đây tôi đã phải cung cấp một chức năng mới cho dự án của mình: chức năng "tải xuống dưới dạng PDF". Điều đầu tiên tôi tự hỏi là tại sao chúng tôi nên cung cấp chức năng này? Không phải nó đã tồn tại nguyên bản với hầu hết các trình duyệt web với tùy chọn nhấp chuột phải / print / "save as pdf"? Tôi đã thử trên trang web của mình và kết quả thực sự đáng thất vọng:
Ví dụ trên trang ngẫu nhiên Boursorama , giống như sau:
kết xuất:
Đó là khi tôi nói "ok, tính năng này có thể đáng giá", nhưng tôi nên làm như thế nào? Có nhiều thư viện mã nguồn mở có thể tạo PDF. Nhưng sự lựa chọn của tôi tự nhiên đến với thư viện nổi tiếng do google phát triển: Puppeteer. Theo tôi, đó là cách dễ nhất để giải quyết việc tạo ra các Ứng dụng Trang đơn PDF. Có thể không phải như vậy nếu bạn không xử lý các gói javascript nhưng với HTML / CSS thuần túy. Thật vậy, có những giải pháp dễ dàng hơn cho trường hợp sử dụng này như wkhtmltopdf, html-pdf-node hoặc jspdf chẳng hạn.
Trong bài viết này, tôi muốn cung cấp cho bạn một số mẹo để tạo các tệp PDF đẹp của các SPA với Puppeteer. Đầu tiên, tôi sẽ giải thích cho bạn cách bạn có thể tạo phiên bản có thể in được trên trang của mình bằng React và Puppeteer. Sau đó, tôi sẽ chỉ cho bạn cách sử dụng Puppeteer để tạo trang có thể in mới của bạn.
Đối với phần này, bạn thực sự không cần phải thiết lập Puppeteer hoặc bất kỳ dịch vụ máy in nào khác. Bạn có thể thực hiện các thay đổi đối với mã của mình như bình thường, sau đó nhấn ctrl + P trên trang của bạn để xem nó trông như thế nào:
Tuy nhiên, vòng lặp phản hồi không nhanh như bình thường.
Để điều chỉnh mã của bạn để in, bạn phải bỏ qua 2 điểm khác biệt chính giữa trang web và PDF:
Tạo "phiên bản có thể in" của SPA của bạn bằng React. Để tạo phiên bản có thể in của trang của chúng tôi, bạn sẽ phải thêm / xóa / sửa đổi các thành phần khác nhau tạo nên trang.
Về cơ bản, bạn có 2 giải pháp cho phần này:
Nếu bạn chọn giải pháp thứ hai (ít tốn kém hơn), bạn sẽ phải điều chỉnh các thành phần hiện có của mình. Ví dụ: nếu bạn có một bảng với 3 tab, có thể bạn sẽ muốn hiển thị nội dung của tất cả các tab. Một cái gì đó như hiển thị các tab lần lượt có thể thực hiện thủ thuật:
Chỉ động:
<Table selectedTabIndex="tab1" />
Động và Tĩnh:
const tabNames = ['tab1', 'tab2', 'tab3']
(isPrintable ?
tabNames.map(tabName => <Table key={tabName} selectedTab={tabName} /> :
<Table selectedTabIndex='tab1' />
);
Trong trường hợp này, các isPrintable
đạo cụ sẽ quyết định hiển thị 3 tab hay chỉ hiển thị tab đầu tiên. Bạn có thể chuyển đạo cụ này cho mọi thành phần động trên trang của mình, cần được điều chỉnh để in.
Như bạn có thể thấy với ví dụ Boursorama, các thành phần của bạn có thể bị cắt giữa 2 trang khi cố gắng in trang của bạn. Nó xảy ra vì trình duyệt web của bạn không biết phải ngắt trang ở đâu nếu bạn không nói cho anh ta biết. Đây là nơi thuộc tính break-inside
CSS bước vào. Rõ ràng là bạn không muốn tập hợp các tab trước đó của mình bị cắt ở giữa. Không có đồ thị của bạn hoặc hầu như bất kỳ thành phần nào trên trang của bạn. Sau đó, bạn sẽ phải điều chỉnh mã trước đó để thêm thuộc tính CSS này. Nó sẽ hoạt động với inline-css nhưng bạn có thể không muốn thêm mọi thứ style={{ breakInside: 'avoid' }}
vào mọi nơi trong tệp jsx / tsx của mình.
Bạn muốn sử dụng bảng định kiểu. Và thay vì thêm thuộc tính này trên mọi lớp CSS đã tồn tại, bạn sẽ muốn sử dụng media @print
tùy chọn. Điều này sẽ cho phép bạn tùy chỉnh trang web của mình để chỉ in! Ví dụ: bạn có thể muốn văn bản của mình lớn hơn một chút hoặc có màu xám mịn trên phiên bản có thể in được, vì bất kỳ lý do thẩm mỹ hoặc tiện lợi nào.
Chúng tôi sẽ chỉ thêm cái này vào @media object
tệp css của bạn:
media @print {
body: {
font-size: "16px";
color: "lightgrey";
}
.no-break-inside {
// apply this class to every component that shouldn't be cut off between to pages of your PDF
break-inside: "avoid";
}
.break-before {
// apply this class to every component that should always display on next page
break-before: "always";
}
}
<MyComponent isPrintable=true className="no-break-inside" />
Một vài mẹo CSS này sẽ giúp bạn cải thiện rất nhiều việc hiển thị trang web của mình.
Bây giờ, trang của bạn đã sẵn sàng để in. Bạn biết điều đó khi chuyển các isPrintable
đạo cụ đến trang của mình, nhấp chuột phải + in trên trình duyệt của mình và bạn khá thoải mái với những gì mình nhìn thấy. Đây là phần in ấn. Bây giờ bạn có phiên bản có thể in của trang web của mình, nhưng người dùng không biết về nó và ngay cả khi nhấn ctrl + P trên trang web, họ sẽ thấy phiên bản "động" của trang web. Để cho phép họ tạo phiên bản PDF và tự động tạo phiên bản mới nhất, bạn có thể muốn thêm một nút sẽ tạo trực tiếp phía máy chủ PDF và thậm chí thêm một số tùy chỉnh. Đây là thứ, trong số những thứ khác, Puppeteer được sử dụng để làm.
Puppeteer là một cách phổ biến và tự nhiên để điều khiển Chrome. Nó cung cấp quyền truy cập đầy đủ vào các tính năng của trình duyệt và quan trọng nhất là có thể chạy Chrome ở chế độ hoàn toàn không sử dụng đầu trên máy chủ từ xa […]
—Dima Bekerman, https://www.imperva.com/blog/headless-chrome-devops-love-it-so-do-hackers-heres-why/
![]() |
---|
Lược đồ về cách Puppeteer hoạt động phía máy chủ |
Việc tạo ra ứng dụng React được thực hiện bởi trình duyệt web. Chúng tôi cần môi trường tối thiểu có thể thực thi javascript để hiển thị DOM. Puppeteer sẽ làm điều đó bằng cách phóng một crôm không đầu. Kể từ bây giờ, và vì quá trình tạo được thực hiện trên máy chủ, nên trình duyệt web không cần phải có giao diện người dùng đồ họa (GUI). Chromium với tạo phiên bản có thể in: cùng một trang mà người dùng nhìn thấy trên trình duyệt web của mình nhưng đã isPrintable
kích hoạt đạo cụ. Sau đó Puppeteer sẽ thực thi pdf
chức năng trên trang với một số tùy chọn tùy chỉnh sẽ kích hoạt việc in trang.
Chỉ cần thêm nút có URL gọi dịch vụ máy in:
<Button onClick={window.open(downloadUrl, "_blank")}>Download as PDF</Button>
Đây downloadUrl
thực sự là một yêu cầu GET trên máy chủ của bạn sẽ thực thi Puppeteer trên máy chủ và trả về nội dung có kiểu nội dungapplication/pdf
Vậy mã Puppeteer này trông như thế nào?
Để có thể thực sự tải xuống PDF, bạn chỉ cần một vài dòng mã.
Sau đó, mã tối thiểu sẽ trông giống như sau:
const puppeteer = require("puppeteer");
(async () => {
const browser = await puppeteer.launch(); // launch a browser (chromium by default but you can chose another one)
const page = await browser.newPage(); // open a page in the browser
await page.goto("https://printable-version-of-my-wbe-page.com", {
waitUntil: "networkidle2",
}); // visit the printable version of your page
await page.pdf({ format: "a4", path: "./my_file.pdf" }); // generate the PDF 🎉
await browser.close(); // don't forget to close the browser. Otherwise, it may cause performances issues or the server may even crash..
})();
Đây là các bước phổ biến bạn sẽ cần để tạo tệp PDF. Tùy thuộc vào chương trình phụ trợ của bạn, có thể bạn không muốn tải xuống tệp PDF trên máy chủ mà hiển thị nó trên một đối tượng phản hồi, để gửi nó trở lại máy khách (trình duyệt web của người dùng). Sau đó, bạn nên điều chỉnh page.pdf()
phương pháp const buffer = await page.pdf({ format: 'a4'});
và trả lại vùng đệm này trên _blank
trang mà người dùng đã mở trên trình duyệt của mình, chờ phản hồi.
Tất nhiên, bạn có thể điều chỉnh các tùy chọn tự nhiên có trên trình duyệt của mình, như khổ giấy, tỷ lệ, lề, v.v. với sự trợ giúp của tài liệu chính thức: https://github.com/puppeteer/puppeteer/blob/v10 .4.0 / docs / api.md # pagepdfoptions .
Một tùy chọn thú vị mà tôi đề xuất, chủ yếu là vì tùy chọn mặc định do Google Chrome cung cấp thực sự xấu, là mẫu đầu trang hoặc chân trang. Chỉ cần đọc mẫu tệp HTML và chuyển nó qua dữ liệu bạn muốn hiển thị, chẳng hạn như ngày hiện tại, số trang cho mỗi trang hoặc thậm chí là hình ảnh / biểu trưng:
const footerBase = fs.readFileSync("./footer.html", "utf8");
customFooter = footerBase
.replace("{{date}}", new Date())
.replace("{{image_data}}", imageData);
await page.pdf({ format: "a4", footerTemplate: customFooter });
sử dụng mẫu html
<style>
#logo {
height: 40px;
content: url("data:image/png;base64,{{image_data}}");
}
</style>
<div id="body">
<div id="page-number-paragraph">
<span id="date">{{date}}</span>
<span>Page</span>
<span class="pageNumber"/></span>
<span>/</span>
<span class="totalPages"></span>
</div>
<div id="brand-container">
<span id="logo"></span>
</div>
</div>
Bây giờ bạn đã cung cấp cho tệp PDF của mình một chân trang được tùy chỉnh hoàn toàn.
Có rất nhiều tùy chọn khác liên quan đến việc tạo PDF, mà còn đối với các bước khởi chạy trình duyệt trước đó, mở trang mới, truy cập URL, điều này sẽ cho phép bạn tùy chỉnh hoàn toàn việc tạo PDF của mình trên máy chủ.
Cuối cùng, bằng cách điều chỉnh mã React / CSS của bạn và sử dụng Puppeteer, bạn có thể dễ dàng cung cấp một tệp PDF hoàn toàn tùy chỉnh cho trang của mình. Hơn nữa, Puppeteer đang làm tất cả những thứ ở phía máy chủ. Điều này làm cho tính năng này hoàn toàn minh bạch, khá nhanh cho người dùng cuối và mang lại kết quả tương tự cho mọi người dùng trên bất kỳ trình duyệt nào! Puppeteer thực sự mạnh mẽ và có nhiều tùy chọn giúp tạo PDF khá dễ dàng cho các nhà phát triển, đồng thời kết xuất tùy chỉnh và đẹp hơn nhiều so với mặc định trên trình duyệt của người dùng.
Nguồn: https://blog.theodo.com/2021/10/pdf-generation-react-puppeteer/
1594369800
SQL stands for Structured Query Language. SQL is a scripting language expected to store, control, and inquiry information put away in social databases. The main manifestation of SQL showed up in 1974, when a gathering in IBM built up the principal model of a social database. The primary business social database was discharged by Relational Software later turning out to be Oracle.
Models for SQL exist. In any case, the SQL that can be utilized on every last one of the major RDBMS today is in various flavors. This is because of two reasons:
1. The SQL order standard is genuinely intricate, and it isn’t handy to actualize the whole standard.
2. Every database seller needs an approach to separate its item from others.
Right now, contrasts are noted where fitting.
#programming books #beginning sql pdf #commands sql #download free sql full book pdf #introduction to sql pdf #introduction to sql ppt #introduction to sql #practical sql pdf #sql commands pdf with examples free download #sql commands #sql free bool download #sql guide #sql language #sql pdf #sql ppt #sql programming language #sql tutorial for beginners #sql tutorial pdf #sql #structured query language pdf #structured query language ppt #structured query language
1615544450
Since March 2020 reached 556 million monthly downloads have increased, It shows that React JS has been steadily growing. React.js also provides a desirable amount of pliancy and efficiency for developing innovative solutions with interactive user interfaces. It’s no surprise that an increasing number of businesses are adopting this technology. How do you select and recruit React.js developers who will propel your project forward? How much does a React developer make? We’ll bring you here all the details you need.
Facebook built and maintains React.js, an open-source JavaScript library for designing development tools. React.js is used to create single-page applications (SPAs) that can be used in conjunction with React Native to develop native cross-platform apps.
In the United States, the average React developer salary is $94,205 a year, or $30-$48 per hour, This is one of the highest among JavaScript developers. The starting salary for junior React.js developers is $60,510 per year, rising to $112,480 for senior roles.
In context of software developer wage rates, the United States continues to lead. In high-tech cities like San Francisco and New York, average React developer salaries will hit $98K and $114per year, overall.
However, the need for React.js and React Native developer is outpacing local labour markets. As a result, many businesses have difficulty locating and recruiting them locally.
It’s no surprise that for US and European companies looking for professional and budget engineers, offshore regions like India are becoming especially interesting. This area has a large number of app development companies, a good rate with quality, and a good pool of React.js front-end developers.
As per Linkedin, the country’s IT industry employs over a million React specialists. Furthermore, for the same or less money than hiring a React.js programmer locally, you may recruit someone with much expertise and a broader technical stack.
React is a very strong framework. React.js makes use of a powerful synchronization method known as Virtual DOM, which compares the current page architecture to the expected page architecture and updates the appropriate components as long as the user input.
React is scalable. it utilises a single language, For server-client side, and mobile platform.
React is steady.React.js is completely adaptable, which means it seldom, if ever, updates the user interface. This enables legacy projects to be updated to the most new edition of React.js without having to change the codebase or make a few small changes.
React is adaptable. It can be conveniently paired with various state administrators (e.g., Redux, Flux, Alt or Reflux) and can be used to implement a number of architectural patterns.
Is there a market for React.js programmers?
The need for React.js developers is rising at an unparalleled rate. React.js is currently used by over one million websites around the world. React is used by Fortune 400+ businesses and popular companies such as Facebook, Twitter, Glassdoor and Cloudflare.
As you’ve seen, locating and Hire React js Developer and Hire React Native developer is a difficult challenge. You will have less challenges selecting the correct fit for your projects if you identify growing offshore locations (e.g. India) and take into consideration the details above.
If you want to make this process easier, You can visit our website for more, or else to write a email, we’ll help you to finding top rated React.js and React Native developers easier and with strives to create this operation
#hire-react-js-developer #hire-react-native-developer #react #react-native #react-js #hire-react-js-programmer
1651604400
React Starter Kit is an opinionated boilerplate for web development built on top of Node.js, Express, GraphQL and React, containing modern web development tools such as Webpack, Babel and Browsersync. Helping you to stay productive following the best practices. A solid starting point for both professionals and newcomers to the industry.
See getting started guide, demo, docs, roadmap | Join #react-starter-kit chat room on Gitter | Visit our sponsors:
The master
branch of React Starter Kit doesn't include a Flux implementation or any other advanced integrations. Nevertheless, we have some integrations available to you in feature branches that you can use either as a reference or merge into your project:
master
)feature/redux
)feature/apollo
)master
)You can see status of most reasonable merge combination as PRs labeled as TRACKING
If you think that any of these features should be on master
, or vice versa, some features should removed from the master
branch, please let us know. We love your feedback!
React Starter Kit
| React Static Boilerplate
| ASP.NET Core Starter Kit
| |
---|---|---|---|
App type | Isomorphic (universal) | Single-page application | Single-page application |
Frontend | |||
Language | JavaScript (ES2015+, JSX) | JavaScript (ES2015+, JSX) | JavaScript (ES2015+, JSX) |
Libraries | React, History, Universal Router | React, History, Redux | React, History, Redux |
Routes | Imperative (functional) | Declarative | Declarative, cross-stack |
Backend | |||
Language | JavaScript (ES2015+, JSX) | n/a | C#, F# |
Libraries | Node.js, Express, Sequelize, GraphQL | n/a | ASP.NET Core, EF Core, ASP.NET Identity |
SSR | Yes | n/a | n/a |
Data API | GraphQL | n/a | Web API |
♥ React Starter Kit? Help us keep it alive by donating funds to cover project expenses via OpenCollective or Bountysource!
Anyone and everyone is welcome to contribute to this project. The best way to start is by checking our open issues, submit a new issue or feature request, participate in discussions, upvote or downvote the issues you like or dislike, send pull requests.
Copyright © 2014-present Kriasoft, LLC. This source code is licensed under the MIT license found in the LICENSE.txt file. The documentation to the project is licensed under the CC BY-SA 4.0 license.
Author: kriasoft
Source Code: https://github.com/kriasoft/react-starter-kit
License: MIT License