I don't like yasnippet because it require file name matches abbreviation.
;; (setq srecode-mode-table-list nil)
;; (srecode-load-tables-for-mode 'web-mode)
;; (srecode-dump-templates "web-mode")
set mode "web-mode"
set escape_start "{{"
set escape_end "}}"
set comment_start "<!--"
set comment_end "--!>"
set comment_prefix ""
context file
template empty
"Fill out an empty file."
----
<!DOCTYPE html>
<html>
<head>
<title>{{?TITLE}}</title>
<meta name="viewport" content="width=device-width; initial-scale=1.0"/>
<meta charset="utf-8"/>
</head>
<body>
{{^}}
</body>
</html>
----
bind "h"
;; prompt NAME "Name for declaration: "
template tag
""
----
<{{?NAME}}>{{^}}</{{NAME}}>
----
bind "t"
template js :indent
----
<script src="{{^}}"></script>
----
bind "j"
template js-inline :indent
----
<script>
{{^}}
</script>
----
template css :indent
----
<link rel="stylesheet" type="text/css" href="{{^}}">
----
bind "c"
template css-inline :indent
----
<style>
{{^}}
</style>
----
template meta-charset :indent
----
<meta charset="{{^}}"/>
----
template meta-viewport :indent
----
<meta name="viewport" content="width=device-width; initial-scale=1.0"/>
----