Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to include external .js file to ejs Node template page

Tags:

node.js

ejs

I cannot find a way to include external .js file to Node ejs template. I want to put logic and data into object in external .js file, include that file to index.ejs template and pull data from it.

I tried by inserting standard way <script src="sample.js"></script>, and it doesn't work

Then I tried ejs specific keyword <% include partials/sample.js %> and this works only for adding partials (ejs code snippets).

I inserted .js file into static directory which is defined in executable server.js, no results again.

But interestingly, including css file into ejs template classic way works fine, for example

<link href="/assets/styles.css" rel="stylesheet" type="text/css" />

Workaround would be to include external ejs file where I would put logic and data inside <% %> tags, but this is obviously a patch and not a viable solution, because ejs is not a js file. Besides, it doesn't work.

I cannot find any solution on Internet. Any hint?

Thanks

like image 270
Dan Avatar asked Oct 29 '17 14:10

Dan


Video Answer


1 Answers

I believe you are using it contrary to the intent. In a controller you can define external scripts and styles you want to include like so

      res.render('page-one', {
        title: 'Page One',
        data: pageData,
        libs: ['page-one', 'utils'],
        styles: ['page-one']
      });

In your static assets for your app you have a js folder and a css folder

            |- static/
               |- css/
               |- fonts/
               |- img/
               |- js/
               favicon.ico
            |- templates/

In your js folder you place the file page-one.js and utils.js In your css folder you place the file page-one.css

In the head section of your html in the ejs template

    <!-- styles included on all pages -->
    <link rel="stylesheet" href="/css/bootstrap.css">
    <!-- styles specific to individual pages -->
    <% if (typeof styles !== 'undefined') { %>
        <% if (styles.length > 0) { %>
            <% for (let style of styles) { %>
                <link rel="stylesheet" href="/css/<%= style %>.css">
            <% } %>
        <% } %>
    <% } %>

Typically it is best practice to include scripts at closing body tag so they don't block page render so before the closing body tag in your ejs file

<!-- scripts included on all pages -->
<script src='/js/libs/jquery.min.js' type='text/javascript'></script>

<!-- page specific scripts -->
<% if (typeof libs !== 'undefined') { %>
    <% for (let lib of libs) { %>
        <script src='/js/<%= lib %>.js' type='text/javascript'></script>
    <% } %>
<% } %>
</body>

When your page renders it will render the script and CSS includes automatically The if block is in case you don't define any includes in the controller. In your Express application you define your static and external script includes like so Remember up above we created js and css folders inside a directory named static

// Define static assets
app.use(express.static('static'));
// included on all pages
app.use('/js/libs', express.static(path.join(process.cwd(), 'node_modules/jquery/dist'), { maxAge: 31557600000 }));

Finally, if you absolutely must include JavaScript in your template like rendering JSON data, etc. using special ejs tag <%- %>

<% if (jsonData) { %>
<script id="jsonData">var jsonData=<%- JSON.stringify(jsonData) %>;</script>
<% } %>
like image 124
Greg Avatar answered Oct 11 '22 15:10

Greg