Im coding for a school project and they dropped this code, that is working fine. But they want us to bundle those javascript files into one file, using imports/exports. It looks EASY but it's NOT.
index.html
<!DOCTYPE html>
<html>
<head>
<title>Basic routing</title>
<link rel="stylesheet" href="css/style.css" />
</head>
<body>
<a href="#">Home</a>
<a href="#pagelist">PageList</a>
<a href="#pagelist/borderlands">PageList borderlands</a>
<section id="pageContent">Choisissez un lien</section>
<script src="js/Home.js"></script>
<script src="js/PageList.js"></script>
<script src="js/PageDetail.js"></script>
<script src="js/routes.js"></script>
<script src="app.js"></script>
// then i'll use <script src="./dist/bundle.js"></script>
</body>
</html>
src/js/Home.js
const Home = (argument = "") => {
console.log("Page List", argument);
};
export default Home
src/js/PageDetail.js
const PageDetail = (argument) => {
const preparePage = () => {
cleanedArgument = argument.replace(/\s+/g, "-");
const fetchGame = (url, argument) => {
let finalURL = url + argument;
fetch(`${finalURL}`)
.then((response) => response.json())
.then((response) => {
let { name, released, description } = response;
let articleDOM = document.querySelector(".page-detail .article");
articleDOM.querySelector("h1.title").innerHTML = name;
articleDOM.querySelector("p.release-date span").innerHTML = released;
articleDOM.querySelector("p.description").innerHTML = description;
});
};
fetchGame(`https://api.rawg.io/api/games?key=4a7bd6f3d4314002babc4e422c08c2e6& ${cleanedArgument}`);
};
const render = () => {
pageContent.innerHTML = `
<section class="page-detail">
<div class="article">
<h1 class="title"></h1>
<p class="release-date">Release date : <span></span></p>
<p class="description"></p>
</div>
</section>
`;
preparePage();
};
render();
};
export default PageDetail
src/js/PageList.js
const PageList = (argument = "") => {
const preparePage = () => {
cleanedArgument = argument.replace(/\s+/g, "-");
let articles = "";
const fetchList = (url, argument) => {
let finalURL = url;
if (argument) {
finalURL = url + "?search=" + argument;
}
fetch(`${finalURL}`)
.then((response) => response.json())
.then((response) => {
response.results.forEach((article) => {
articles += `
<div class="cardGame">
<h1>${article.name}</h1>
<h2>${article.released}</h2>
<a href = "#pagedetail/${article.id}">${article.id}</a>
</div>
`;
});
document.querySelector(".page-list .articles").innerHTML = articles;
});
};
fetchList(`https://api.rawg.io/api/games?key=4a7bd6f3d4314002babc4e422c08c2e6& ${cleanedArgument}`);
};
const render = () => {
pageContent.innerHTML = `
<section class="page-list">
<div class="articles">...loading</div>
</section>
`;
preparePage();
};
render();
};
export default PageList
src/js/routes.js
const routes = {
"": Home,
"pagelist": PageList,
"pagedetail": PageDetail,
};
export default routes
src/js/index.js
import Home from './Home'
Home() // trying to invoke them one by one.. but it's not working
import PageList from './PageList'
PageList() //
import PageDetail from './PageDetail'
PageDetail() //
import routes from './routes'
routes()
let pageArgument;
const setRoute = () => {
let path = window.location.hash.substring(1).split("/");
pageArgument = path[1] || "";
var pageContent = document.getElementById("pageContent");
routes[path[0]](pageArgument);
return true;
};
window.addEventListener("hashchange", () => setRoute());
window.addEventListener("DOMContentLoaded", () => setRoute());
Now if I take all the code from all the files and put them in one file. It works. But i don't understand how to do and why it's so hard for something thats looks really easy.
in-one-file, its working but I must use imports/exports, so I cannot use that !
const Home = (argument = "") => {
console.log("Batman", argument);
};
const PageDetail = (argument) => {
const preparePage = () => {
cleanedArgument = argument.replace(/\s+/g, "-");
const fetchGame = (url, argument) => {
let finalURL = url + argument;
fetch(`${finalURL}`)
.then((response) => response.json())
.then((response) => {
let { name, released, description } = response;
let articleDOM = document.querySelector(".page-detail .article");
articleDOM.querySelector("h1.title").innerHTML = name;
articleDOM.querySelector("p.release-date span").innerHTML = released;
articleDOM.querySelector("p.description").innerHTML = description;
});
};
fetchGame(`https://api.rawg.io/api/games?key=4a7bd6f3d4314002babc4e422c08c2e6& ${cleanedArgument}`);
};
const render = () => {
pageContent.innerHTML = `
<section class="page-detail">
<div class="article">
<h1 class="title"></h1>
<p class="release-date">Release date : <span></span></p>
<p class="description"></p>
</div>
</section>
`;
preparePage();
};
render();
};
const PageList = (argument = "") => {
const preparePage = () => {
cleanedArgument = argument.replace(/\s+/g, "-");
let articles = "";
const fetchList = (url, argument) => {
let finalURL = url;
if (argument) {
finalURL = url + "?search=" + argument;
}
fetch(`${finalURL}`)
.then((response) => response.json())
.then((response) => {
response.results.forEach((article) => {
articles += `
<div class="cardGame">
<h1>${article.name}</h1>
<h2>${article.released}</h2>
<a href = "#pagedetail/${article.id}">${article.id}</a>
</div>
`;
});
document.querySelector(".page-list .articles").innerHTML = articles;
});
};
fetchList(`https://api.rawg.io/api/games?key=4a7bd6f3d4314002babc4e422c08c2e6& ${cleanedArgument}`);
};
const render = () => {
pageContent.innerHTML = `
<section class="page-list">
<div class="articles">...loading</div>
</section>
`;
preparePage();
};
render();
};
const routes = {
"": Home,
"pagelist": PageList,
"pagedetail": PageDetail,
};
let pageArgument;
const setRoute = () => {
let path = window.location.hash.substring(1).split("/");
pageArgument = path[1] || "";
var pageContent = document.getElementById("pageContent");
routes[path[0]](pageArgument);
return true;
};
window.addEventListener("hashchange", () => setRoute());
window.addEventListener("DOMContentLoaded", () => setRoute());