This package offers both a CLI and a library to help you with linting HTML for over 50 common SEO issues.
This SEO tool was spun out of Elder.js' plugin called seo-check.
The library exports a Tester
method which returns an object with 2 methods: folder
and test
.
If you have a folder of .html
files you're looking to check for common SEO issues, you just need to specify the folder and seo-lint will recursively check all of the .html files for issues.
const { Tester } = require('./Tester');
const tester = Tester({ siteWide: true, host: 'example.com' });
const results = await tester.folder('public'); // relative to process.cwd()
If you have a build process that generates HTML, such as a static site generator, and want to lint that html generated for common SEO issues you can do the following:
const { Tester } = require('./Tester');
const tester = Tester({ host: 'example.com' });
const results = await tester.test(html, relPermalink);
// results will be an object with issues by url and sitewide issues.
$ npm i -g @nickreese/seo-lint
Usage:
seo-lint <dir> [options]
Options
-H
,--host
Set the expected host for internal links. (example.com)-v
,--version
Displays current version-c
,--config
Set a custom config to specify rules.-w
,--write
Location to write a report to a JSON file.
CLI config
// const { defaultPreferences, rules } = require('@nickreese/seo-lint');
// available if you want the defaults from the package.
module.exports = {
rules: [],
preferences: {},
writeLocation: `./report.json`, // if this is set it assumes you want the report written.
display: ['errors', 'warnings'],
};
Advanced Example:
$ seo-lint public -H example.com -c seo-lint.config.js -w report.json
These are only checked when Elder.js runs in build mode.
- check for orphaned pages (no incoming internal links)
- check for broken internal links.
- check for duplicate title tags
- check for duplicate meta descriptions
- canonical tag exists
- canonical tag matches
request.permalink
- Title tag exists
- Title tag
innerText
andinnerHTML
are the same. (no html tags in your title tag) - Only one title tag per page
- Title tag is less than 70 chars
- Title tag is more than 10 chars
- Title doesn't include common stopwords.
- Title tag doesn't have
null
- Title tag doesn't have
undefined
- checks for stop words.
- meta description exists
- only one meta description tag per page
- Meta description doesn't have
null
- Meta description doesn't have
undefined
- Meta description is longer than 10 chars
- Meta description is less than than 120 chars
- Meta description is longer than 300 chars (sometimes things go REALLY wrong and this helps catch it.)
- Meta description includes at least one the keywords of the title tag.
- h1 Exists on page
- only a single h1 per page.
- h1 has at least one word from your title tag
- h1 is less than 70 chars
- h1 is more than than 10 chars
- H2 or H3 don't exist if an H1 is missing.
- H2 exists on the page
- h2 is less than 100 chars
- h2 is more than than 10 chars
- At least one of your h2s contains a single word from your title tag.
- h3 is less than 100 chars
- h3 is more than than 7 chars
- h4 is less than 100 chars
- h4 is more than than 7 chars
- If no h2s checks for h3s.
- If no h3s checks for h4s.
- If no h4s checks for h5s.
- If no h5s checks for h6s.
- Checks images for alt tags.
- Internal links are lowercase
- Internal links have trailing slash
- Internal links are not
nofollow
- Notifies if there are more than 50 outbound links on the page.
- check for trailing
index.html
- internal fully formed links include 'https'
- Checks for
width=device-width, initial-scale=1.0
meta viewport.
Written by Nick Reese. Initially written to audit Elder Guide.
- We could add a way to filter out rules based on name.
This project is licensed under the MIT License - see the LICENSE file for details.